2016-04-08 11 views
2

コンパイル済みの正規表現を動的に作成したいと思います。さて、問題はありません:動的に作成されたregexpをコンパイルする簡潔な方法

my $rx = join('|', keys %replacement_hash); 

繰り返し呼び出しでオーバーヘッドを避けるためにコンパイルしたいと思います。問題ありません:

問題はありますが、これは簡単な操作では長すぎます。 2行と2つの余分な時間私は変数名に言及する必要があるので、私はそれを名前を変更することを決めた場合、私は3つの位置すべてでそれを変更する必要があります。

sub qr_expr { qr/$_[0]/ } 
# and later 
my $rx = qr_expr(join('|', keys %replacement_hash)); 

か、単に分かりやすく、私はそれを必要と同等の機能をインライン化:

これまでのところ私は(まだどこかでこの機能を維持することの欠点を持っているでしょう)ヘルパー関数を使用してのいずれかで来ています:

my $rx = sub{qr/$_[0]/}->(join('|', keys %replacement_hash)); 

もっと簡潔に書く方法はありますか?

+3

[ 'map'](http://perldoc.perl.org/functions/map.html):'私の( $ rx)= map {qr/$ _ /}結合( '|'、キー%replacement_hash) ' –

+0

@HunterMcMillen、いいです!余分なコンテキスト()arond 'my'リストが必要ない場合... –

+0

mapはリストを返します。最初の要素(この場合は要素が1つしかない)をキャプチャしたい場合は、括弧を使用する必要があります。それ以外の場合は、リストのサイズが取得されます。 –

答えて

3
my ($re) = map qr/$_/, join '|', map quotemeta, @strings; 

コンパイルする必要はありません。

ほとんどの場合、別のパターン(たとえば/^$re\z/または/($re)/)にパターンを埋め込み、強制的にパターンを再コンパイルします。 (/$re/は再コンパイルされず、等価なものはありません=~ $re

さらに、Perlはコンパイルした最後のパターンのコンパイル済みフォームをキャッシュします。同じパターンを再度コンパイルするように要求された場合は、単にキャッシュされたコピーを返します。以下は十分であろう

な状況の両方で

、:

あなたが使用することができ
my $pat = join '|', map quotemeta, @strings; 
+0

普通の文字列は実際には 'qr //'とほぼ同等ですが、 '/ o'はまだ私の驚きに5-10%の増加をもたらすようです。私は長い時間前にそれを取り除くことを望んだ。 –

関連する問題