use strict; use warnings; my $lookup; while(my($parent, @children) = =~ /(\S+)\s*/g) { $lookup->{$parent} ||= []; push @{$lookup->{$parent}}, @children; } sub build { my $children = delete $lookup->{+shift} || []; my $parent = {}; $parent->{$_} = build($_) for(@$children); return $parent; } my $tree = build('ROOT'); use Data::Dumper; print Dumper $tree; __DATA__ ROOT a b c b e f a d