[Tokyo.pm] look-behind in mg pattern, and relative backreference

Kazumasa Utashiro utashiro @ iij.ad.jp
2002年 3月 5日 (火) 08:04:55 CST


From: maeda @ tokyo.pm.org
Subject: Re: [Tokyo.pm] look-behind in mg pattern, and relative backreference
Date: Tue, 05 Mar 2002 10:53:12 +0900

> 歌代さん> (は|が|に|を)\1
> 
> /はは|がが|にに|をを/ とするのが一番わかりやすいのは確かでしょうが、
> まあそれは置いといて。

まま、まま、

> 歌代さん> たとえば、\-1 で1つ前の括弧が参照できればいいんでしょうけど。
> 
> どうしてもこれをやりたければ、(?{ code })を使うしかないかなあ。

やっぱりそうですかね。一応思い付きはしたんですが、できたとしてもあまり
にトリッキーなので、もっとまともな方法がないもんかと思って聞いてみまし
た。

> こんなの↓やってみたんですが、Perl5.6.1と5.7.2ではperlがコアダン
> プしてしまいました。
> 
> while (<>) {
>     use re 'eval';
>     local $x = qr(x);
>     print $&, "\n" if /([a-d])(?{ $x=qr($^N) })(??{ $x })/x;
> }

コアダンプするのは qr がまずいみたいで、

    print $&, "\n" if /([a-d])(?{ $x=$+ })(??{ $x })/x;

としたら、一応落ちずに動きます。

スコープのせいなのかなんなのか、最初の値を憶えてるみたいなので、

    print $&, "\n" if /([a-d])(?{ $x=$+ })(??{ eval "\$x" })/x;

としたら、一応予想通り動くように見えます。

ところで、

    print $&, "\n" if /([a-d])(??{ qr($+) })/x;

は動くんですが、前田さんがこうしなかった意図は何?

--utashiro



Tokyo-pm メーリングリストの案内