$start = { 'lineitem' => { 'invoice' => 1 }, 'market_x_branch' => { 'insurer' => 1 }, 'invoice' => { 'lineitem' => 1 }, 'insurer' => { 'market_x_branch' => 1 } }; #### $end = [ [ 'lineitem', 'invoice' ], [ 'market_x_branch', 'insurer' ] ]; #### foreach my $x (keys %$start) { next unless exists $start->{$x}; my @values = ($x, keys %{$start->{$x}}); push @$end, \@values; delete $start->{$_} for @values; } #### $start = { 'lineitem' => { 'invoice' => 1 }, 'invoice' => { 'lineitem' => 1, 'claim' => 1 }, 'insurer' => { 'claim' => 1 }, 'claim' => { 'invoice' => 1, 'insurer' => 1 } }; $end = [ [ 'invoice', 'claim', 'insurer', 'lineitem', ], ];