我正在尝试使用多个条件构造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";
如果有可能的话。
答案 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)
||
,&&
,or
和and
都是二元运算符,这意味着它们需要两个操作数。相反,您可以使用grep
接受事物列表并通过某个谓词表达式过滤它们:
if ( grep { $string_as_array[$i] eq $_ } qw(Ham bur) ) {
...
}