在 Perl 中,如何将一个字符串与其他字符串列表进行匹配?

In Perl, how can I match one string against a list of other strings?

我想根据一小部分字符串检查数组 $columns[2] 中的元素。我现在的方式是;

if (   $columns[2] eq 'string1' 
    || $columns[2] eq 'string2' 
    || $columns[2] eq 'string3' 
    || ...) { 
   ...
}

看来一定有比所有OR更好的方法。

这正是 grep 的用途:

my $element_exists = 
   grep { $columns[2] eq $_ } qw(string1 string2 ... stringN);

另一种方法是使用 first,它会在找到匹配项后停止处理。这样,如果您第一个字符串匹配 $columns[2],您就不必比较剩余的 n-1 个字符串:

use List::Util qw/first/;

my $element_exists = 
   defined first { $columns[2] eq $_ } qw(string1 string2 ... stringN);

您也可以 any(如@ThisSuitIsBlackNot 下面建议的那样)用于此目的,略有不同的是第一个 returns 匹配条件的元素的值,任何 returns 一个布尔值:

use List::Util qw/any/;

my $element_exists = 
   any { $columns[2] eq $_ } qw(string1 string2 ... stringN);

您可以使用正则表达式。如果( $columns[2] =~ /^$string1|$string2|$string3$/

确保使用 ^ 和 $ 以确保 $string1,2 或 3 不仅包含在 $columns[2] 中。