如何在Perl中检查多个模式匹配

时间:2011-03-02 13:46:02

标签: perl pattern-matching

有没有办法可以避免将其用于多种模式检查?

我可以撕掉数组中的所有模式并检查它是否与模式数组中的任何模式匹配?当我有超过20个模式字符串时,请考虑这种情况。

if(  ($_=~ /.*\.so$/)
  || ($_=~ /.*_mdb\.v$/)
  || ($_=~ /.*daidir/)
  || ($_=~ /\.__solver_cache__/)
  || ($_=~ /csrc/)
  || ($_=~ /csrc\.vmc/)
  || ($_=~ /gensimv/)
){
  ...
}

3 个答案:

答案 0 :(得分:11)

如果您可以使用Perl版本5.10,那么有一种非常简单的方法可以做到这一点。 只需使用新的smart match (~~)运算符。

use warnings;
use strict;
use 5.10.1;

my @matches = (
  qr/.*\.so$/,
  qr/.*_mdb\.v$/,
  qr/.*daidir/,
  qr/\.__solver_cache__/,
  qr/csrc/,
  qr/csrc\.vmc/,
  qr/gensimv/,
);

if( $_ ~~ @matches ){
  ...
}

如果您不能使用Perl 5.10,那么我会使用List::MoreUtils::any

use warnings;
use strict;
use List::MoreUtils qw'any';

my @matches = (
  # same as above
);

my $test = $_; # copy to a named variable

if( any { $test =~ $_ } @matches ){
  ...
}

答案 1 :(得分:4)

另一个pre-Perl 5.10选项是Regexp::Assemble,它将获取模式列表并将它们组合成一个正则表达式,它将立即测试所有原始条件。

答案 2 :(得分:1)

您的原始代码可能写得更好:

if(  /.*\.so$/
  || /.*_mdb\.v$/
  || /.*daidir/
  || /\.__solver_cache__/
  || /csrc/
  || /csrc\.vmc/
  || /gensimv/
) { ... }

这是因为$_ =~ /foo//foo/相同。如果您有Perl 5.10或更高版本,我会像Brad建议的那样使用智能匹配运算符。