在 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] 中。
我想根据一小部分字符串检查数组 $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] 中。