#!/usr/bin/env perl use strict; use warnings; my $root = '#'; my %tree; while () { chomp; my ($id, $pid, $name) = split /,/; $tree{$id} = {name => $name, pid => $pid}; } my @paths; push @paths, concat($_, \%tree) for keys %tree; print join(',', @$_), "\n" for sort { @$a <=> @$b || $a->[0] cmp $b->[0] } @paths; sub concat { my ($id, $tree, $path) = @_; $path = [] unless defined $path; push @$path, $tree->{$id}{name}; if ($tree->{$id}{pid} ne $root) { concat($tree->{$id}{pid}, $tree, $path); } return $path; } __DATA__ 15,10,name3 10,#,name1 12,10,name2 5,12,name4 8,5,name5 #### name1 name2,name1 name3,name1 name4,name2,name1 name5,name4,name2,name1