【问题标题】:In Perl, how can I match one string against a list of other strings? [duplicate]在 Perl 中,如何将一个字符串与其他字符串列表进行匹配? [复制]
【发布时间】:2015-10-07 15:38:38
【问题描述】:

我想检查数组$columns[2] 中的一个元素与一个小字符串列表。我现在的方式是;

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

似乎必须有比所有 OR 更好的方法。

【问题讨论】:

  • if (grep {$_ eq $columns[2]} qw (string1 string2 string3)) {}
  • 如果字符串看起来相似,您可以探索一个表示这些字符串匹配的正则表达式

标签: perl string-matching


【解决方案1】:

这正是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 建议)为此目的,略有不同的是首先返回与条件匹配的元素的值,任何返回布尔值:

use List::Util qw/any/;

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

【讨论】:

  • @ThisSuitIsBlackNot Nope,any 更有意义。
  • 是的,如果您使用first,您可能应该检查$element_exists 是否已定义,以防它匹配错误值; any 总是返回一个布尔值。
【解决方案2】:

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

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

【讨论】:

  • 应该是:"if( $columns[2] =~ /^($string1|$string2|$string3)$/" 否则会匹配string2作为子串
猜你喜欢
  • 2018-10-11
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 2017-07-04
相关资源
最近更新 更多