正規表現のパターンをコンパイルする
[Perlop の翻訳です]
qr//
は、STRING を正規表現としてクォート(可能ならコンパイル)します。
STRING は m/PATTERN/
の PATTERN と同じように補完されます。
もし "'"
が区切り文字に使われたら、一切の変数補完は行われません。
対応の /STRING/msixpodualn
表現の代わりに使うことができる Perl 値を返します。
その戻り値とは元のパターンを正規化したものとなります。
同じ文字を含む文字列とは不思議なことに異なります。
というのも、ref(qr/x/)
は "Regexp" を返します。
そのデリファレンスに関してはっきりと定義されていません(今のところ元のパターンが正規化されたものが得られますが、
これは変更されるかもしれません)。
$rex = qr/my.STRING/is;
print $rex; # (?^si:my.STRING) と出力される
s/$rex/foo/;
上記のコードは、次のコードと同等です。
s/my.STRING/foo/is;
qr//
の結果は、サブパターンとして使うこともできます。
$re = qr/$pattern/;
$string =~ /foo${re}bar/; # パターンの一部としても利用可能
$string =~ $re; # スタンドアローンでも利用可能
$string =~ /$re/; # この方法でも利用可能
Perl は qr()
演算子の実行時にそのパターンをコンパイルすることがあります。
そのため、qr()
を使うと、とりわけ qr()
の結果がスタンドアローンで使われた場合、
状況によっては処理速度が速くなるかもしれません。
sub match {
my $patterns = shift;
my @compiled = map qr/$_/i, @$patterns;
grep {
my $success = 0;
foreach my $pat (@compiled) {
$success = 1, last if /$pat/;
}
$success;
} @_;
}
qr()
によってパターンを内部表現に事前コンパイルすることで、
/$pat/
が評価されるたびにパターンの再コンパイルの必要性を回避しています。
(Perl は他にも多くの内部最適化を持ち合わせていますが、qr()
演算子を使わなかったら、
前述の例の中ではどの最適化も行われないでしょう。)
qr//
に指定できるオプションは下表のとおりです。
オプション | 説明 |
---|---|
m |
文字列を複数行として扱います。 |
s |
文字列を 1 行として扱います。(. を改行に一致させます) |
i |
大文字と小文字を区別せずにパターンマッチを行います。 |
x |
拡張正規表現を使います:x を 2 つ指定すると、\t と SPACE 文字は角括弧 [] クラスの中では無視されます。 |
p |
マッチングの際、マッチした文字列のコピーを保持して ${^PREMATCH} , ${^MATCH} ,
${^POSTMATCH} を使えるようにします。
(v5.20 以降は常に使えるようになったため、このオプションは無視されます。)
|
o |
パターンのコンパイルを 1 度だけにします。 |
a |
ASCII 制限:\d , \s , \w , [[:posix:]]
文字クラスに対して ASCII を使います。
2 つの a を指定すると、/i のもとでは、非 ASCII 文字にはどんな ASCII
文字も一致しない、という制約が追加されます。
|
l |
ランタイムのロケールのルールを使います。 |
u |
ユニコードのルールを使います。 |
d |
5.12 以前では、ユニコードまたはネイティブの文字セットを使います。 |
n |
非 キャプチャーモードにします。() に一致した文字列を $1 や $2 にセットしないなど。 |
事前コンパイルされたパターンがより大きなパターンに組み込まれているなら、"msixpluadn"
の効果は適切に伝搬します。
/o
修飾子が持つ効果は伝搬せず、それを明示的に使うことで、その効果はそれらのパターンに制限されます。
/a
, /d
, /l
, /u
修飾子(Perl 5.14 で追加)は、
文字セットのルールを制御しますが、明示的に指定したくなるのは /a
だけでしょう。
他の 3 つは様々なプラグマによって自動的に選択されます。
STRING の正当な構文に関するさらなる情報、そして、正規表現のセマンティクスの詳細については
perlre をご覧ください。
今ではもう使われなくなった /o
を除くすべての修飾子は、
perlre の "Modifiers"
で詳しく解説されています。