文字列中のパターンマッチを検索し、
true(1)
または false ('')
を返す。
=~
や !~
で文字列を指定しない場合は $_
文字列を検索する。
(=~
で指定される文字列は左辺値である必要はない ---
expression 評価の結果でも良いが、 =~
の方が優先度が高いことに注意。)
Regular Expression
の章も参照のこと。
See section 正規表現.
/
が delimiter であるなら、最初の m
は省略可能である。
m
を使うと、
アルファベット・数字でない任意の文字のペアを delimiter として使える。
これは Unix のパス名(/
を含む)のマッチングをするのに便利である。
二つ目のdelimiter の後にオプション i
をつけると、
case insensitive でマッチングを行う。
PATTERN
はスカラー変数を含んでいても良いが、
パターン検索を行う毎に置き換えが行われる(そしてパターンが再コンパイルされる)。
(注意:$)
と $|
は文字列の終わりのチェックに使われるであろうから、
置き換えは行われない。)
パターンを最初の一回だけコンパイルさせたい時は、
最後のオプションに o
を指定する。
こうすると実行時の再コンパイルを避けることができるので、
変数で置き換えている値がスクリプト実行中に変わらないのであれば、便利である。
PATTERN
がヌル文字列に評価された場合、
直前に成功した正規表現が代わりに用いられる。
配列値が必要な文脈で使うと、パターンマッチはパターンを括弧でくくったもの、
すなわち ($1, $2, $3 ...)
にマッチする subexpression からなる
配列を返す。実際には $1
、$2
などをセットせず、
この場合だと、$+
、$`
、$&
、$'
もセットしない。
マッチングが失敗した場合、ヌル配列が返る。
マッチングが成功した場合、括弧が一つもなければ、配列値 (1)
が返る。
open(tty, '/dev/tty');
<tty> =~ /^y/i && do foo(); # y と答えたら do foo
if (/Version: *([0-9.]*)/) { $version = $1; }
next if m#^/usr/spool/uucp#;
# poor man's grep
$arg = shift;
while (<>) {
print if /$arg/o; # 1 回だけコンパイルする
}
if (($F1, $F2, $Etc) = ($foo =~ /^(\S+)\s+(\S+)\s*(.*)/))
最後の例は、$foo
を二つの word と残りに分け、
これら三つのフィールドを $F1
, $F2
, $Etc
に代入する。
どの変数が変更されても、すなわち、パターンがマッチすれば、条件は真である。
修飾子 "g"
はグローバルパターンマッチを指定する -- すなわち、
文字列中で可能なかぎりマッチを行なう。
コンテキストによりどのように振舞うか。
配列のコンテキストでは、
正規表現中のすべての括弧とマッチする substring からなるリストを返す。
括弧が一つもない場合、パターン全体の回りに括弧があるかのように扱い、
マッチした全文字列のリストを返す。
スカラーのコンテキストでは、文字列全体について繰り返しを行い、
マッチする度に TRUE を返し、ついにマッチしなくなった時点で FALSE を返す。
(言い替えれば、前にどこまでマッチを行なったかを覚えておき、
その位置から検索を再開する。)
最後のマッチを行なってから文字列を変更していないということを仮定している。
マッチの間で文字列を変更すると未定義の動作を行なう可能性がある。
(実は、substr()
を使って全文字列の長さを変えないで
文字列をその場で(in-place)変更する場合にはうまくいく。しかし、一般的には、
そのような変更を行なう場合は s//g
を使うべきである。)
例:
# array context
($one,$five,$fifteen) = (`uptime` =~ /(\d+\.\d+)/g);
# scalar context
$/ = 1; $* = 1;
while ($paragraph = <>) {
while ($paragraph =~ /[a-z]['")]*[.!?]+['")]*\s/g) {
$sentences++;
}
}
print "$sentences\n";
See section 正規表現.