$bracketpair = qr{\{ # begin with a left bracket. [^{}]* # something other than bracket. (?: # defining a cluster. (??{$bracketpair}) # postponed regular subexpression evaluated at runtime. # this construct is replaced with a group of parenthesized group. [^{}]* # something other than bracket. ) # end of a cluster definition. * # repetition of the cluster. \} # end with a right bracket. }x;
よーするに左中括弧から、それと対になる右中括弧までにマッチする。 $bracketpair の値の評価が再帰的に行われるのだっ! いっけん $bracketpair の値を最初に評価するときに値が不定 (undef) になっちゃって るような気がするが、再帰をたどってゆくと、いずれ左中括弧にマッチしない 入力に対して $bracketpair の値が評価される時がおとずれ、そこで $bracketpair の値が nil に確定するのだっ! と、思う。けど。ちがうかも。
たとえば↓こんなのを入力にあたえると、
int i; for (i = 0; i < 10; i++) { // ここの左中括弧から if (cond) { } else { } } // ここの右中括弧までにマッチする。 exit(1); } // ここの右中括弧はマッチの範囲外。
パーサ使うの面倒だから regexp で済まそうとしたらむしろ面倒だった、とゆ うありがちなナニ。