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);