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