Как проверить соответствие нескольких шаблонов в Perl - PullRequest
5 голосов
/ 02 марта 2011

Есть ли способ, которым я могу избежать использования этого для нескольких проверок шаблонов?

Могу ли я разорвать все шаблоны в массиве и проверить, соответствует ли он какому-либо шаблону в массиве шаблонов?Пожалуйста, рассмотрите случай, когда у меня более 20 строк шаблонов.

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

Ответы [ 3 ]

11 голосов
/ 02 марта 2011

Если вы можете использовать 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 ){
  ...
}
4 голосов
/ 02 марта 2011

Еще одна опция, предшествующая Perl 5.10, это Regexp :: Assemble , которая возьмет список шаблонов и объединит их в одно регулярное выражение, которое будет проверять все исходные условия одновременно.

1 голос
/ 02 марта 2011

Ваш оригинальный код мог бы быть написан так:

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

Это потому, что $_ =~ /foo/ - это то же самое, что и /foo/. Если у вас Perl 5.10 или выше, я бы сделал, как предложил Брэд, и использовал бы оператор умного совпадения.

...