- 2004-10-24
- perl
perlの正規表現の m/../g と \G の働きがよくわからん。 m/../g はスカラコンテキストでは、 前回マッチした位置から開始して、マッチしたかどうかを返すらしい。 でも「前回マッチした結果」って何だ?
$a = 'abcde'; print "$&\n" if $a =~ m/[ace]/g; print "$&\n" if $a =~ m/[ace]/g; print "$&\n" if $a =~ m/[ace]/g; $ perl x.pl a c e
なるほど。これはわかる。 ではこの $a を文字列リテラルにしてみる。
print "$&\n" if 'abcde' =~ m/[ace]/g; print "$&\n" if 'abcde' =~ m/[ace]/g; print "$&\n" if 'abcde' =~ m/[ace]/g; $ perl x.pl a a a
この場合は「前回マッチした」とは扱われないようだ。 さっきの例の $a を途中で書き変えてみるとどうなるだろう。
$a = 'abcde'; print "$& $'\n" if $a =~ m/[ace]/g; $a = 'abeee'; print "$& $'\n" if $a =~ m/[ace]/g; print "$& $'\n" if $a =~ m/[ace]/g; $ perl x.pl a a e
途中で書き換えると、また先頭からマッチを始めている。 さてこれをふまえて、\Gについてはまた今度 (続く)。