use warnings; use strict; my $data = { '986172' => { 'cat_parent_id' => '', 'cat_name' => 'Category1' }, '986178' => { 'cat_parent_id' => '986177', 'cat_name' => 'Category4' }, '986177' => { 'cat_parent_id' => '986176', 'cat_name' => 'Category3' }, '986176' => { 'cat_name' => 'Category2', 'cat_parent_id' => '986172' } }; map{$data->{$data->{$_}{cat_parent_id}}{cat_child_id} = $_} grep{$data->{$_}{cat_parent_id}} keys %$data; my ($node) = grep{!$data->{$_}{cat_parent_id}} keys %$data; my @chain = $data->{$node}{cat_name}; while ($data->{$node}{cat_child_id}) { $node = $data->{$node}{cat_child_id}; push @chain, $data->{$node}{cat_name}; } print join ',', @chain; #### Category1,Category2,Category3,Category4