<p>If you have a hash (or reference to a hash) in perl with many dimensions and you want to iterate across all values, what's the best way to do it.  In other words, if we have
$f->{$x}{$y}, I want something like</p>

<pre><code>foreach ($x, $y) (deep_keys %{$f})
{
}
</code></pre>

<p>instead of </p>

<pre><code>foreach $x (keys %f) 
    {
    foreach $y (keys %{$f-&gt;{$x}) 
    {
    }
}
</code></pre>

It's easy enough if all you want to do is operate on values, but if you want to operate on keys, you need specifications of how levels will be recoverable.
a. For instance, you could specify keys as
```
"$level1_key.$level2_key.$level3_key"
```
--or any separator, representing the levels.
b. Or you could have a list of keys.
I recommend the latter.
Level can be understood by
```
@$key_stack
```
and the most local key is
```
$key_stack->[-1]
```
.
The path can be reconstructed by:
```
join( '.', @$key\_stack )
```
Code:
```
```
use constant EMPTY_ARRAY => [];
use strict;    
use Scalar::Util qw<reftype>;

sub deep_keys (\%) { 
    sub deeper_keys { 
        my ( $key_ref, $hash_ref ) = @_;
        return [ $key_ref, $hash_ref ] if reftype( $hash_ref ) ne 'HASH';
        my @results;

        while ( my ( $key, $value ) = each %$hash_ref ) { 
            my $k = [ @{ $key_ref || EMPTY_ARRAY }, $key ];
            push @results, deeper_keys( $k, $value );
        }
        return @results;
    }

    return deeper_keys( undef, shift );
}

foreach my $kv_pair ( deep_keys %$f ) { 
    my ( $key_stack, $value ) = @_;
    ...
}
```
```
This has been tested in Perl 5.10.