Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

If statement with multiple conditions in perl

Tags:

perl

I'm trying to construct an if statement with multiple conditions without being too verbose. Currently I have:

my $string = "Hamburger";
my @string_as_array = ( $string =~ m/.../g );
my $x=(scalar @string_as_array);
for(my $i=0; $i<$x; $i++)   {
    if ($string_as_array[$i] eq "Ham" || $string_as_array[$i] eq "bur") {
        print "CHEESE";
    }
    elsif ($string_as_array[$i] eq "ger")   {
        print "WICH";
    }
    else {
        print $string_as_array[$i];
    }
}
print "\n";

Ideally I'd like something like this for the first if statement if it is possible:

my $string = "Hamburger";
my @string_as_array = ( $string =~ m/.../g );
my $x=(scalar @string_as_array);
for(my $i=0; $i<$x; $i++)   {
    if ($string_as_array[$i] eq "Ham" || "bur") {
        print "CHEESE";
    }
    elsif ($string_as_array[$i] eq "ger")   {
        print "WICH";
    }
    else {
        print $string_as_array[$i];
    }
}
print "\n";

If it's possible.

like image 812
quantik Avatar asked Dec 17 '25 21:12

quantik


1 Answers

my %map = (
   'Ham' => 'CHEESE',
   'bur' => 'CHEESE',
   'ger' => 'WICH',
);

say $string =~ s{...}{ $map{$&} // $& }serg;

Other things are much more badly in need simplifying!

The symbol soup

my $x=(scalar @string_as_array);
for (my $i=0; $i<$x; $i++) 

simplifies to

for (my $i=0; $i<@string_as_array; $i++) 

which simplifies to

for my $i (0 .. $#string_as_array)

But you don't actually need the index (just the elements), so replace that with

for my $part (@string_as_array)

or even

for my $part ( $string =~ /.../sg )

That already gives us something cleaner:

for my $part ( $string =~ /.../sg ) {
    if ($part eq "Ham" || $part eq "bur") {
        print "CHEESE";
    }
    elsif ($part eq "ger")   {
        print "WICH";
    }
    else {
        print $part;
    }
}

That said, what we now have begs for a hash lookup.

my %map = (
   'Ham' => 'CHEESE',
   'bur' => 'CHEESE',
   'ger' => 'WICH',
);

for my $part ( $string =~ /.../sg ) {
    print $map{$part} // $part;
}

print("\n");

We could use a while loop instead.

while ( $string =~ /.../sg ) {
    print $map{$&} // $&;
}

print("\n");

We could even switch to a substitution operator.

say $string =~ s{...}{ $map{$&} // $& }serg;
like image 160
ikegami Avatar answered Dec 20 '25 11:12

ikegami



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!