Tree Summing問題

[id:lethevert:20051213:p2]
PCREはそれとして、この問題は、PerlのOne-Linerかつ1正規表現でやってみようかと思います。
とりあえず、今のところできている部分。(見やすいように展開)

#!/usr/bin/perl
$_=join '', <stdin>;
while(
s/\(\)
 |\(\s*
    (\d+)
    (\s*\|((\d+\s*\|)*\d+))?
  \s*\)
/if($1){
   if(!length($2)){
     "|$1"
   }else{
     '|'.join('|', (map {$1+$_} (split(\/\s*\|\/, $3))))
   }
}/gex
){print}

実行結果は、こんな感じになります。

22 |27|22|26|18
20 |27|22|26|18
10 |9|13|10|8
5 

あとは、下のような判定コードを組み合わせるだけなんですが。

@a=split(/\s*\|/,$_);
$a=shift @a;
if(grep {$a==$_} @a){
  print "yes"
}else{
  print "no"
}