Another proposal:
use strict;
use warnings;
use feature 'say';
my %tree;
while (<DATA>) {
chomp;
my ($id, $pid, $name) = split /,/;
$tree{$id} = {pid => $pid, name => $name};
}
for my $id (sort keys %tree) {
my @parent_list;
my $temp_id = $id;
while (exists $tree{$temp_id}) {
push @parent_list, $tree{$temp_id}{name};
$temp_id = $tree{$temp_id}{pid};
}
say join ",", @parent_list;
}
__DATA__
15,10,name3
10,#,name1
12,10,name2
5,12,name4
8,5,name5
Output:
name1
name2,name1
name3,name1
name4,name2,name1
name5,name4,name2,name1