my %hash = ( foo => { bar => { baz => 'one', quux => 'two', }, }, field => 'value', this => { that => undef, }, ); my @stack = \%hash; my @path; while(@stack) { my($k,$v); unless( ($k, $v) = each %{ $stack[0] } ) { shift @stack; pop @path; next; } if(ref $v eq 'HASH') { unshift @stack => $v; push @path => $k; } else { print join('/' => @path, $k), " => ", ( defined $v ? $v : "undef" ), "\n"; } } __output__ foo/bar/quux => two foo/bar/baz => one this/that => undef field => value