Perl で正規表現をプリコンパイルする方法はありますか? 質問する

Perl で正規表現をプリコンパイルする方法はありますか? 質問する

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おそらく時期尚早なマイクロ最適化です。また、潜在的な落とし穴でもあります。変数がもっているを使用すると、/oPerl は古い正規表現を使用するようになります。これにより、診断が困難なバグが発生する可能性があります。

おすすめ記事