use strict; use warnings; my %parent_id = (); my %id_to_name = (); # Building the tree while (my $line = ) { chomp $line; my ($id,$parent_id,$name) = split /,/, $line; $parent_id{$id} = $parent_id; $id_to_name{$id} = $name; } # Dumping the tree my %name_to_id = reverse %id_to_name; for my $name (sort keys %name_to_id) { my $id = $name_to_id{$name}; my $parent_id = $parent_id{$id}; my @ancestors = ($name); while (my $name = $id_to_name{$parent_id}) { push @ancestors,$name; $parent_id = $parent_id{$parent_id}; } print join(',',@ancestors),"\n"; } __DATA__ 15,10,name3 10,#,name1 12,10,name2 5,12,name4 8,5,name5