如果在perl中有多个条件的语句

时间:2017-04-10 19:57:38

标签: 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") {
        print "CHEESE";
    }
    elsif ($string_as_array[$i] eq "ger")   {
        print "WICH";
    }
    else {
        print $string_as_array[$i];
    }
}
print "\n";

理想情况下,如果有可能,我会在第一个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" || "bur") {
        print "CHEESE";
    }
    elsif ($string_as_array[$i] eq "ger")   {
        print "WICH";
    }
    else {
        print $string_as_array[$i];
    }
}
print "\n";

如果有可能的话。

3 个答案:

答案 0 :(得分:6)

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

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

其他事情更加需要简化!

符号汤

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

简化为

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

简化为

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

但是你实际上并不需要索引(只是元素),所以用

替换它
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;

答案 1 :(得分:2)

正则表达式交替可能。

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

答案 2 :(得分:1)

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

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