perl中具有多个条件的If语句

perl中具有多个条件的If语句,perl,Perl,我试图构造一个包含多个条件的if语句,但不要太冗长。目前我有: 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") {

我试图构造一个包含多个条件的
if
语句,但不要太冗长。目前我有:

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";

如果可能的话

正则表达式的交替是可能的

if ($string_as_array[$i] =~ /^(?:Ham|bur)$/) {
    ...
}

|
和&
以及
都是二进制运算符,这意味着它们需要两个操作数。相反,您可以使用接受事物列表并通过某个谓词表达式过滤它们的:

if ( grep { $string_as_array[$i] eq $_ } qw(Ham bur) ) {
   ...
}

其他事情更需要简化

象征汤

my $x=(scalar @string_as_array);
for (my $i=0; $i<$x; $i++) 
但是您实际上不需要索引(只需要元素),所以用

for my $part (@string_as_array)
甚至

for my $part ( $string =~ /.../sg )
这已经给了我们更干净的东西:

for my $part ( $string =~ /.../sg ) {
    if ($part eq "Ham" || $part eq "bur") {
        print "CHEESE";
    }
    elsif ($part eq "ger")   {
        print "WICH";
    }
    else {
        print $part;
    }
}
这就是说,我们现在所拥有的需要进行散列查找

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

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

print("\n");
$part
毫无意义,因此不妨使用
$1
切换到while循环以节省内存

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

print("\n");
最后一个变换:

say $string =~ s{(...)}{ $map{$1} // $1 }serg;

这个很好用,谢谢!我想没有grep也有办法做到这一点,但这可能是我能找到的最简单的解决方案,如果我有多个键指向相同的值
'Ham'
'bur'
,例如,在这种情况下,有没有办法将它们组合在同一行上?我很好奇,因为我有30-40个指向同一个值的3个字母键。用
(map{$\=>'CHEESE'=>'Ham'=>'CHEESE'}qw(Ham bur))
替换
'Ham'=>'CHEESE'=>'CHEESE'
,我会使用
列表::Util::any{$string\u as\u数组[$1]eq$}qw(Ham bur)
,如果只是为了得到短路。然而,在这种特殊情况下,散列可能更好。不确定为什么会被否决,这似乎是完美的reasonable@Tanktalus当然同意,短路就好了
for my $part ( $string =~ /.../sg ) {
    if ($part eq "Ham" || $part eq "bur") {
        print "CHEESE";
    }
    elsif ($part eq "ger")   {
        print "WICH";
    }
    else {
        print $part;
    }
}
my %map = (
   'Ham' => 'CHEESE',
   'bur' => 'CHEESE',
   'ger' => 'WICH',
);

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

print("\n");
while ( $string =~ /(...)/sg ) {
    print $map{$1} // $1;
}

print("\n");
say $string =~ s{(...)}{ $map{$1} // $1 }serg;