my $ds = { '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_parent_id' => '986172', 'cat_name' => 'Category2', } }; # invert the structure: my $sd = { map { $ds->{$_}{'cat_parent_id'} => { 'cat_child_id' => $_, 'cat_name' => $ds->{$_}{'cat_name'} } } keys %$ds }; sub foo # recursive { local $_ = shift || ''; exists $sd->{$_} ? foo( $sd->{$_}{'cat_child_id'}, @_, $sd->{$_}{'cat_name'} ) : @_ } print join ',', foo();