2007/01/30

後方参照のおべんきょう

実験その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);" の意味がいまだによくわからない・・・これ別に後方参照しなくてもいいんじゃね?

Search

Option

Document

Comment

アイテム詐欺で「再」逮捕
04/22 : Kerry Beck
04/30 : コールマンならここ
04/30 : 駐車場探す
05/01 : コールマンなら
05/01 : 単身引越し
05/02 : 高収入バイト バツイチ
05/06 : 老人ホーム 評判
05/07 : マリメッコはこちら
06/07 : Amber Stevens
カテゴリ名変更&新しい楽器がふえたよ
02/14 : そうこ
06/26 : 室井
08/20 : そうこ
09/22 : そうこ
春よ、来い
05/08 : simuzy
05/08 : simuzy
05/12 : そうこ

Tackback

リタリンの処方が打ち切られた
03/27 : ノビじいの鬱々日記
foreshortenedプラグイン改造
01/23 : ISO TANK!

Log

2010年
12月
2009年
10月 9月 8月 6月
2008年
11月 10月 9月 6月 4月 2月
2007年
12月 2月 1月
2006年
11月 10月 9月 3月
2005年
10月 9月 7月

Link