$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 で済まそうとしたらむしろ面倒だった、とゆ うありがちなナニ。