2009-06-04 5 views

答えて

57

リテラル(静的)正規表現では、何もしません - perlは一度だけコンパイルします。

if ($var =~ /foo|bar/) { 
    # ... 
} 

変数に格納された正規表現には、いくつかのオプションがあります。あなたは、正規表現オブジェクトを構築するためにqr//演算子を使用することができます。

my $re = qr/foo|bar/; 

if ($var =~ $re) { 
    # ... 
} 

あなたが複数の場所で正規表現を使用するか、またはサブルーチンに渡したい場合、これは便利です。

正規表現パターンが文字列である場合は、それは決して変わらないのperl約束する/oオプションを使用することができます。しかし、

my $pattern = 'foo|bar'; 

if ($var =~ /$pattern/o) { 
    # ... 
} 

それがないために、通常は良いでしょうが。 Perlは、変数が変更されておらず、正規表現を再コンパイルする必要がないことを知るのに十分にスマートです。おそらく/oを指定するのは時期尚早のマイクロ最適化です。潜在的な落とし穴でもあります。変数に変更された場合、/oを使用すると、perlは古い正規表現を使用します。それはバグを診断するのが難しくなる可能性があります。

+3

これは本当です。しかし、qr //は何年にもわたってサポートされています(5.005以降に存在していて、5.8以降は何の問題もないと思います) – ephemient

+8

@ephemient 5.10はqr //に関連した厄介なメモリリークを持っていますこれは修正されています)。 5.10を使用している場合は、perl -e 'qr // while 1'と言ってメモリリークがあるかどうかを調べることができます。私はActiveState Perl 5.10のOS X版がまだ壊れていることを知っています。 –

+2

2016からの注意: '/ o'修飾子は非推奨です。詳細については、[この質問](http://stackoverflow.com/q/550258/477563)を参照してください。 –

19

シンプル:qr //演算子(Regexp Quote-Like Operatorsの下のperlopに記載されています)を確認してください。

my $regex = qr/foo\d/; 
$string =~ $regex; 
+0

いいです、それはs ///構造のパターンとして使用できるようです。それはまだプリコンパイルされているのですか、この場合は再びコンパイルされていますか? – akostadinov

+0

@akostadinovまだプリコンパイルされています。 –

関連する問題