2011-03-02 3 views
5

複数のパターンチェックにこれを使用することを避ける方法はありますか?Perlで複数のパターンマッチングをチェックする方法

配列内のすべてのパターンを破棄し、パターン配列内のパターンと一致するかどうかを確認できますか?私は20以上のパターン文字列を持っている場合を考慮してください。

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

@エリック大変申し訳ございませんでした。 – Arovit

答えて

11

Perlバージョン5.10を使用できるのであれば、本当に簡単に行うことができます。 新しいsmart match (~~)オペレータを使用してください。あなたは5.10を使用できない場合

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){ 
    ... 
} 

、私は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

smartmatchにはexperimentalとしてフラグが立てられており、今後通知することなく*削除*されます。 (このようなサウンドは5.26で起こります)。後者の解決方法は、Perlのバージョンに関係なく使用する必要があります。 – ikegami

4

もう一つ前のPerl 5.10のオプションは、パターンのリストを取り、一度に元の条件のすべてをテストする単一の正規表現にそれらを結合しますこれは、Regexp::Assembleです。

+0

これは、特にパターンが複数の値に対してテストされている場合にはるかに効率的です。正規表現のマッチを開始するには、実際にはかなり高価です。 – ikegami

1

あなたの元のコードは、このように、よりきれいに書かれている可能性:

$_ =~ /foo/はちょうど /foo/と同じであるためである
if( /.*\.so$/ 
    || /.*_mdb\.v$/ 
    || /.*daidir/ 
    || /\.__solver_cache__/ 
    || /csrc/ 
    || /csrc\.vmc/ 
    || /gensimv/ 
) { ... } 

。 Perl 5.10以上をお持ちの場合は、Bradがスマートマッチ演算子を提案して使用するようにします。

関連する問題