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

qua*_*tik 3 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";
Run Code Online (Sandbox Code Playgroud)

理想情况下,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";
Run Code Online (Sandbox Code Playgroud)

如果它是可能的.

ike*_*ami 6

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

say $string =~ s{(...)}{ $map{$1} // $1 }serg;
Run Code Online (Sandbox Code Playgroud)

其他事情更需要简化!

象征汤

my $x=(scalar @string_as_array);
for (my $i=0; $i<$x; $i++) 
Run Code Online (Sandbox Code Playgroud)

简化为

for (my $i=0; $i<@string_as_array; $i++) 
Run Code Online (Sandbox Code Playgroud)

这简化为

for my $i (0 .. $#string_as_array)
Run Code Online (Sandbox Code Playgroud)

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

for my $part (@string_as_array)
Run Code Online (Sandbox Code Playgroud)

甚至

for my $part ( $string =~ /.../sg )
Run Code Online (Sandbox Code Playgroud)

这已经给了我们更清洁的东西:

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

那就是说,我们现在要求哈希查找.

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

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

print("\n");
Run Code Online (Sandbox Code Playgroud)

$part是没有意义的,所以不妨通过切换到while循环来节省内存$1.

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

print("\n");
Run Code Online (Sandbox Code Playgroud)

最后的转变:

say $string =~ s{(...)}{ $map{$1} // $1 }serg;
Run Code Online (Sandbox Code Playgroud)