In article <1017890618.302241.17865.nullmailer / ev.netlab.jp>,
  matz / ruby-lang.org (Yukihiro Matsumoto) writes:

> |(正規表現の拡張なので、まつもとさんに確認が必要でしょうが。)
> 
> 名前。Pythonと.NETのそれぞれで正規表現にこの機能が追加されて
> いますが、名前が違います。なぜかPerlにはないんですよね。

えぇと、この Python や .NET のは shy group を含まないので微妙にずれて
いたりするんですがそれはそれとすると、想像ですが、Perl では名前を付け
ても Perl のコードからアクセスすることができない(MatchData に対応する
ものがないので特殊変数をさらに増やす必要がある)から入れにくいんじゃな
いですかね。

Python では MatchObject (Ruby でいう MatchData) があるので、group メソッ
ドに名前を文字列で渡すことにより自然に取り出せます。

Ruby にあってもべつに問題ない機能だと思います。$~[:name] とかで取り出
せばいいのでしょう。たぶん、とても便利だと思います。

たとえば、最近、

      if /(\A\z)
         |(\A\*)
         |(\A\d\.)
         |(\A:)
         |(\A\s)
         |(\A---)
         |(\A=)
         |(\A\|\s)
         /x =~ line
        if    $~[1]; '_'
        elsif $~[2]; 'u'
        elsif $~[3]; 'o'
        elsif $~[4]; 'd'
        elsif $~[5]; 'i'
        elsif $~[6]; 'h'
        elsif $~[7]; enable_section ? 's' : 'X'
        elsif $~[8]; 't'
        end

というコードを書いたのですが、このコードでは番号の対応をとるのが厄介で
す。もし、

      if /(?<empty>\A\z)
         |(?<unordered>\A\*)
         |(?<ordered>\A\d\.)
         |(?<definition>\A:)
         |(?<indent>\A\s)
         |(?<hr>\A---)
         |(?<section>\A=)
         |(?<table>\A\|\s)
         /x =~ line
        if    $~[:empty]; '_'
        elsif $~[:unordered]; 'u'
        elsif $~[:ordered]; 'o'
        elsif $~[:definition]; 'd'
        elsif $~[:indent]; 'i'
        elsif $~[:hr]; 'h'
        elsif $~[:section]; enable_section ? 's' : 'X'
        elsif $~[:table]; 't'
        end

と書けるんならとても幸せです。まぁ、この場合は普通のマッチなので、それ
ぞれのパターンで別個にマッチさせてもいいのですが、String#scan や
String#gsub だとそうもいきません。

なお、Python のやつは単に番号に対して alias を付けるだけな感じですが、
.NET ではそれだけではないところには注意しないといけないかも知れません。

たとえば、複数のグループに同じ名前を付けることができるので、

  href=(?:"(?<val>[^"]*)"|(?<val>[^ >]*)

というような用途に使えたり、他にもいろいろな機能に関係しているようです。
-- 
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)