my %data = ( '10517' => { 'parent' => '10516', 'start' => 1545321095, 'end' => 1545321098, 'name' => 'A' }, '10515' => { 'parent' => '10513', 'start' => 1545321091, 'end' => 1545321095, 'name' => 'B' }, '10514' => { 'parent' => '10513', 'start' => 1545321091, 'end' => 1545321095, 'name' => 'C' }, '10516' => { 'parent' => '10513', 'start' => 1545321091, 'end' => 1545321095, 'name' => 'D', }, '10511' => { 'parent' => '#####', 'start' => 1545321090, 'end' => 1545321099, 'name' => 'E' }, '10513' => { 'parent' => '10511', 'start' => 1545321091, 'end' => 1545321097, 'name' => 'F' }, ); foreach my $pid (sort(keys(%data))) { my @parent_list; my $temp_id = $pid; while (exists $data{$temp_id}) { push (@parent_list, $data{$temp_id}{name}); $temp_id = $data{$temp_id}{parent}; } my $line = join("\t|||\t",@parent_list)."\n"; print $line; }