後方参照のおべんきょう
〔プログラムな?話〕 13:23 No Comment ツイート
実験その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);" の意味がいまだによくわからない・・・これ別に後方参照しなくてもいいんじゃね?