Home > perl > /gと\G

/gと\G

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についてはまた今度 (続く)。

Writeback:0

Comment Form

writeback message: Ready to post a comment.

TrackBack ping me at
http://www.mono-space.net/blog/perl/gandG.trackback

Page Top