or download this
use Data::Dumper; $s = \%p; @s = (); while (<>) { while (/\G\s*(?:([-\
+w.]+)|:([-\w.]+)\s*\(|(\)))/gc) { if (defined($1)) { defined($$s{""})
+ and die "parse error: two"; $$s{""} = $1; } elsif (defined($2)) { pu
+sh @s, $s; $s = $$s{$2} = {}; } elsif (defined($3)) { @s or die "pars
+e error: close"; $s = pop @s; } } /(\S.*)/g and die "parse error: jun
+k: $1"; } $! and die "read error"; $s == \%p or die "parse error: ope
+n"; print Dumper(\%p);