正規表現でTree Summing

[id:lethevert:20051216:p1]
長いこと放置していましたが、これも方を付けないと。
とりあえず、今までの内容をまとめたものを以下に。

#!/usr/bin/perl
$_=join '', <stdin>;

while(
s/\s*\(\)
 |\s*\(\s*
    (\d+)
    (\|((\d+\|)*\d+))?
  \s*\)
/if($1){
   if(!length($2)){
     "|$1"
   }else{
     '|'.join('|', (map {$1+$_} (split(\/\s*\|\/, $3))))
   }
}/gex
){}

for(split /\s+/){
  @ARGV=split /\|/;
  $l=shift;
  print ((grep {$l==$_} @ARGV)?"yes\n":"no\n");
}

スペースを詰めてみた。

$_=join"",<stdin>;while(s/\s*\(\)|\s*\(\s*(\d+)(\|((\d+\|)*\d+))?\s*\)/if($1){if(!length($2)){"|$1"}else{"|".join("|",(map{$1+$_}(split(\/\s*\|\/, $3))))}}/ge){}for(split/\s+/){@ARGV=split/\|/;$l=shift;print((grep {$l==$_}@ARGV)?"yes\n":"no\n");}

さすがに長いな。One Linerとはいかないな。