Perl で正規表現を事前コンパイルする方法はありますか? プログラムで何度も使用する正規表現があり、使用のたびに変更されません。
ベストアンサー1
リテラル (静的) 正規表現の場合、何もする必要はありません。Perl はそれらを 1 回だけコンパイルします。
if ($var =~ /foo|bar/) {
# ...
}
変数に格納された正規表現にはいくつかのオプションがあります。qr//
正規表現オブジェクトを構築する演算子:
my $re = qr/foo|bar/;
if ($var =~ $re) {
# ...
}
これは、正規表現を複数の場所で使用したり、サブルーチンに渡したりする場合に便利です。
正規表現パターンが文字列内にある場合、/o
オプションを使用して、それが決して変更されないことを Perl に約束することができます。
my $pattern = 'foo|bar';
if ($var =~ /$pattern/o) {
# ...
}
ただし、通常はそうしない方が良いでしょう。Perlは変数が変更されていないことを認識できるほど賢いので、正規表現を再コンパイルする必要はありません。指定することは/o
おそらく時期尚早なマイクロ最適化です。また、潜在的な落とし穴でもあります。変数がもっているを使用すると、/o
Perl は古い正規表現を使用するようになります。これにより、診断が困難なバグが発生する可能性があります。