Perlで正規表現をプリコンパイルする方法はありますか?私はプログラムで何度も使用するものを持っていますが、それは用途間では変わりません。Perlで正規表現をプリコンパイルする方法はありますか?
答えて
リテラル(静的)正規表現では、何もしません - 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は古い正規表現を使用します。それはバグを診断するのが難しくなる可能性があります。
シンプル:qr //演算子(Regexp Quote-Like Operatorsの下のperlopに記載されています)を確認してください。
my $regex = qr/foo\d/;
$string =~ $regex;
いいです、それはs ///構造のパターンとして使用できるようです。それはまだプリコンパイルされているのですか、この場合は再びコンパイルされていますか? – akostadinov
@akostadinovまだプリコンパイルされています。 –
- 1. Perlの正規表現は貪欲ではありません
- 2. 正規表現のパターンがPerlで有効かどうかを確認する方法はありますか?
- 3. Perlの正規表現は
- 4. Perl APIで正規表現をイントロスペクションする方法
- 5. vimのPerl正規表現ですか?
- 6. Perlでの正規表現
- 7. Rubyで正規表現キャプチャをブロックに渡す方法はありますか?
- 8. Perlの正規表現が一致した回数を評価する方法はありますか?
- 9. Perlの正規表現
- 10. Perl正規表現シングルクォート
- 11. この正規表現を書く良い方法はありますか?
- 12. Perlの正規表現は、固定
- 13. URL Perlでの正規表現
- 14. Perlの正規表現は無視されていますか?
- 15. このperl正規表現は何と一致しますか?
- 16. Perl正規表現で/ rフラグを使用するには?
- 17. Perlの正規表現リテラルでセミコロンをエスケープする必要はありますか?
- 18. perlを使った正規表現に基づいてシフトする方法は?
- 19. Perl正規表現の優先順位ルールは何ですか?
- 20. 正規表現に問題はありますか?
- 21. ある正規表現を含むが別の正規表現を除外する正規表現
- 22. Perl正規表現を理解していますか?
- 23. Perlでは、一致する正規表現にいくつのグループがありますか?
- 24. 正規表現:正の整数を解析する方法はありますか?
- 25. Pythonで正規表現にマッチするものをすべて見つける方法はありますか?
- 26. キャプチャを正規表現で任意の回数繰り返す方法はありますか?
- 27. コマンドラインからファイルを操作するPerlの正規表現
- 28. Perl正規表現のスラッシュ変数
- 29. たPerl:異常な正規表現
- 30. Perl互換の正規表現「」スペースと 『(』 『)』
これは本当です。しかし、qr //は何年にもわたってサポートされています(5.005以降に存在していて、5.8以降は何の問題もないと思います) – ephemient
@ephemient 5.10はqr //に関連した厄介なメモリリークを持っていますこれは修正されています)。 5.10を使用している場合は、perl -e 'qr // while 1'と言ってメモリリークがあるかどうかを調べることができます。私はActiveState Perl 5.10のOS X版がまだ壊れていることを知っています。 –
2016からの注意: '/ o'修飾子は非推奨です。詳細については、[この質問](http://stackoverflow.com/q/550258/477563)を参照してください。 –