正規表現演算子 m//

正規表現パターンで文字列をマッチングする

構文

解説

[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 の利用意義は次のいずれかだけです:

  1. 変数が相当に長い文字列で、それが変更されることがないと分かっており、 Perl にそのテストをスキップさせることで処理速度を少しでも向上させる必要がある。 (これをすると、保守上の制約が出てきます。 つまり、あなたはパターンの中の変数を変更しないと約束したようなものです。 もしそれを変更したとしても、Perl はそれに気づくことすらないでしょう。)
  2. 変数の変更の有無に関わらず、その変数の初期値をパターンに使わせたい。 (しかし、/o を使わなくても、これを達成するまともな方法があります。)
  3. 次のように、パターンに組み込みコードが含まれる。
    use re 'eval';
    $code = 'foo(?{ $x })';
    /$code/
    この場合、Perl は、そのパターン文字列が変更されなかったとしても、 $x の現在の値が毎度見えることを確認するために、毎度、再コンパイルします。 これを避けたいなら /o を使ってください。

要するに、/o を使うことは決して良いアイデアではない、ということです。