6.14 前回パターンがマッチした箇所からマッチングを行う

前回パターンがマッチした箇所からマッチングを再開したい。これができれば、文字列からデータを連続して取り出すことができる。

/g修飾子、/c修飾子、\Gパターンアンカー、pos関数を組み合わせて使用する。
例1. /g修飾子を使って、文字列中にある全ての正の整数を検出する

while (/(\d+)/g) {
  print "Found number $1\n";
}

メタキャラクタ\Gは前回パターンマッチが終了した位置にマッチする。
例2. 数値の先頭に付加されている全ての空白文字を数字の0に置換する。

$n = "    49 here";
$n =~ s/\G /0/g;
print $n;
# => 0049 here

/c修飾子を指定すると、最後にマッチした箇所から続けてマッチングが行われる。

$_ = "The year 1752 lost 10 days on the 3rd of September";

while (/(\d+)/gc) {
  print "Found number $1\n";
}
# /c修飾子により、最後にマッチした箇所から続けてマッチングが行われる

if (/\G(\S+)/g) {
  print "Found $1 right after the last number.\n";
}

# => Found Number 1752
# => Found Number 10
# => Found NUmber 3
# => Found rd after the last number.