正規表現パターンで文字列をマッチングする
[Perlop の翻訳です]
パターンに一致する文字列を検索し、スカラーコンテキストでは、それが成功したら true を返し、失敗したら false を返します。
=~
や !~
演算子を通して文字列が指定されなければ、$_
が文字列として検索されます。
(=~
で指定された文字列は左辺値である必要はありません。
それは式評価の結果となることもできますが、=~
は結びつきのほうが強いことを忘れないでください。)
perlre もご覧ください。
指定できるオプションについては qr//
をご覧ください。
加えて、次のマッチ処理修飾子が利用可能です。
オプション | 説明 |
---|---|
g |
グローバルマッチを行います。つまり、すべての一致を検索します。 |
c |
/g が有効な場合、一致がなくても検索位置をリセットしません。 |
もし "/"
が区切り文字なら、最初の m
がなくても問題ありません。
m
をつけると、ホワイトスペース以外ならどんな ASCII 文字でも区切り文字として使うことができます。
これは "/"
を含むパス名の一致では特に役に立ちます。
エスケープだらけで読みづらくなるのを避けることができます(英語では
LTS (leaning
toothpick syndrome)
と呼ぶそうです)。
もし m?PATTERN?
のように "?"
が区切り文字なら、「一度限りのマッチング」ルールが適用されます。
もし "'" が区切り文字なら、PATTER 上では変数補間が行われません。
識別子(変数や関数の名前)に使える文字を区切り文字に使う場合は、m
の前にホワイトスペースが必要です。
PATTERN に変数を入れることができます。その場合、その変数はパターン検索が評価されるたびに展開されます。
ただし、区切り文字がシングルクォーテーションの場合はその限りではありません。
($(
, $)
, $|
は、文字列終端テストのように見えるため、展開されません。)
Perl は、展開変数に変更がない限り、パターンを再コンパイルすることはありません。
終端の区切り文字の後ろに /o
("once" の頭文字) をつけると、
強制的に Perl にそのテストをスキップさせ決して再コンパイルさせないようにすることができます。
かつて、Perl は不必要に正規表現を再コンパイルしており、この修飾子は、そうさせないことで処理速度向上に役立っていました。
しかし、今では /o
の利用意義は次のいずれかだけです:
/o
を使わなくても、これを達成するまともな方法があります。)
use re 'eval';
$code = 'foo(?{ $x })';
/$code/
この場合、Perl は、そのパターン文字列が変更されなかったとしても、
$x
の現在の値が毎度見えることを確認するために、毎度、再コンパイルします。
これを避けたいなら /o
を使ってください。
要するに、/o
を使うことは決して良いアイデアではない、ということです。