説明しよう

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



肉桂
おれんち
ためしにこんなんつけてみた。どうか? プライバシー侵害? うへへへへ