foreach my $x (keys %$start) { next unless exists $start->{$x}; my @values = ($x, keys %{$start->{$x}}); push @$end, \@values; delete $start->{$_} for @values; }