use warnings; use strict; use Graph; 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' } }; my $g = Graph->new(directed => 1); for my $k (keys %$data) { next unless $data->{$k}{cat_parent_id}; die unless exists $data->{ $data->{$k}{cat_parent_id} }; $g->add_edge($data->{$k}{cat_parent_id}, $k); } my $string = join ",", map { $data->{$_}{cat_name} } $g->topological_sort;