in reply to Why is AofH the way it is?

Your first code should have looked like this:
foreach (0 .. $#Array) { foreach my $tmp (keys %{$Array[$_]}) { print "$tmp\n" } }
The outer loop now uses the array index, not an alias to your array element, as a loop variable. That is what your inner loop expects to see, anyway.