use Data::Dumper; my %not_a_or_b=(); $not_a_or_b{1}{"a"}{"A"}="FIRST"; $not_a_or_b{1}{"c"}{"B"}="THIRD"; $not_a_or_b{1}{"b"}{"C"}="SECOND"; foreach my $k1 ( sort keys %not_a_or_b ) { foreach my $k2 ( sort keys %{$not_a_or_b{$k1}} ) { foreach my $k3 ( sort keys %{$not_a_or_b{$k1}{$k2}} ) { print "$not_a_or_b{$k1}{$k2}{$k3}\n"; } } } print Dumper(\%not_aor_b);