use strict; use v5.10; my $hash = { '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' } }; sub rec { my ($hash, $parent) = @_; my @str; foreach my $k (keys %{ $hash } ) { if ($hash->{$k}->{cat_parent_id} eq $parent) { push @str, $hash->{$k}->{cat_name}; push @str, rec($hash, $k); last; } } return @str; } my @arr = rec($hash, ''); say join(',', @arr); #### sub rec { my ($hash, $parent, $seen) = @_; my @str; foreach my $k (grep { not exists $seen->{$_} } keys %{ $hash } ) { if ($hash->{$k}->{cat_parent_id} eq $parent) { push @str, $hash->{$k}->{cat_name}; $seen->{$k} = 1; push @str, rec($hash, $k, $seen); last; } } return @str; }