"(?{ code })" に見る「正規表現言語」の野望 。 perl 5.8 の正規表現マニュアル man perlre を見ていたら、 highly experimental な "(?{ code })" なるものを見かけた。 いままで、正規表現では、マッチした一部のパターンの結果を $1 や $2 などの変数で参照していた。そのため、正規表現を 適用したあと、別の行でコーディングする必要があった。

この "(?{ code })" は、正規表現のパターン中に、 その合致範囲 "()" に対してどのような処理ができるか コードを記述できる。$^N 変数から、マッチした文字列を とりだして、別の変数にセットできる。

また、()* のような正規表現を利用して、

( a (?{ local $cnt++; } ) )* 
のように書くと、$cnt に、マッチした回数が加算される。 正規表現の最初に書けば、変数を初期化できる。 しかし、読みにくいというか、perlらしいのだろうけれども、 すごい。しかしこれだとデータとコードが本当に混在してしまって、 これでいいのか?という気も。そういうわけか、「だまって 削除するかもしれない」、と警告がマニュアルに書かれている。

"(?{ code })" は深いネストがある正規表現内で、 特定部分のマッチ文字列をとりだしたいときに便利そう。 ()がネストしたり、条件分岐が増えると、特定のマッチ文字列を とりだしにくくなる。