#!/usr/bin/perl use strict; use warnings; use Data::Dumper; sub parse { my $str=shift; my $tree={}; my @now=(\$tree); while($str ne '') { $str=~s/^\s*//s; if($str=~s/^:(\w+)\s*\(//s) { my $name=$1; unshift(@now,\${$now[0]}->{$name}); } elsif($str=~s/^\)//) { shift(@now); } elsif($str=~s/^"([^"]+)"//s) { my $text=$1; # ignore \" while($text=~s/\\"$/"/) { $text.=$1 if($str=~s/^([^"]+)"//s) } ${$now[0]}->{TEXT}.=$text; } elsif($str=~s/^(\w+)//) { ${$now[0]}->{TEXT}.=$1; } elsif($str ne '') { die("FORMAT ERROR ($str)\n"); } } return $tree; } my $str=<