iso tank - プログラムな?話 2007年 01月

後方参照のおべんきょう

実験その1:

do {
while (my $line = shift(@hairetsu)) {
$line =~ /(PATTERN2)-(PATTERN3)/;
$tmp = "$1, $2\n";
}
}
} while ($p =~ s/(PATTERN1)//);
print $tmp;

Whileの条件文内でパターンマッチ、doブロック内でもパターンマッチをして、 両方ともに()をつけてグループ化(後方参照)してみた。簡単にいうと。

結果:

PATTERN1,
PATTERN2,PATTERN3,
PATTERN2,
PATTERN1,
PATTERN1,
PATTERN2,
PATTERN1,
PATTERN1,
PATTERN2,
PATTERN1,
PATTERN1,
PATTERN2,
PATTERN1,
PATTERN1,

深層のwhileブロック内でマッチするパターンがあった場合は、正しくPATTERN2とPATTERN3を 出力してくれたが、PATTERN2もPATTERN3もマッチしなかった時はwhileの条件文でマッチした PATTERN1がどこからともなく呼び出されていた。ような。

深層のwhileブロックがループ開始戻った段階で$n(数字)の値は、毎回毎回最上層の while条件文でマッチした値に初期化されているとゆうか。

つまりこうすると、

do {
while (my $line = shift(@hairetsu)) {
$tmp = "$1, $2\n";
$line =~ /(PATTERN2)-(PATTERN3)/;
}
}
} while ($p =~ s/(PATTERN1)//);
print $tmp;

PATTERN1,しか出力しなくなるわけなんですよ。

こういった動作について言及してるサイトってないかなー?

#元のflavourdirの"while ($p =~ s/(\/*[^\/]*)$// and $1);" の意味がいまだによくわからない・・・これ別に後方参照しなくてもいいんじゃね?