use Data::Dumper; my $tree_in = '(A,(B,C))'; #my $tree_in = "((A,(B,((C,(D,E)),(F,G)))),H)"; $tree_in =~ s/([^,()]+)/\{VALUE=>"$1"\}/g; $tree_in =~ s/\(/\{LEFT=>/g; $tree_in =~ s/,/,RIGHT=>/g; $tree_in =~ s/\)/\}/g; print $tree_in, "\n"; my $tref = eval $tree_in; print Dumper $tref; __END__ {LEFT=>{VALUE=>"A"},RIGHT=>{LEFT=>{VALUE=>"B"},RIGHT=>{VALUE=>"C"}}} $VAR1 = { 'LEFT' => { 'VALUE' => 'A' }, 'RIGHT' => { 'LEFT' => { 'VALUE' => 'B' }, 'RIGHT' => { 'VALUE' => 'C' } } };