my $h = { key1 => 'val1', key2 => { hash_ref2 => 'val2' }, key3 => { hash_ref3 => { deeper => 'deep' , real_deep => { diving => 'now' } }, }, key4 => [ 'array ref1', 'array_ref2' ], }; use Data::Dumper; print Dumper $h; rec_tree( $h ); sub rec_tree { my $val = shift; if ( ref($val) eq 'HASH' ) { rec_tree( $_ ) for values %$val; } elsif ( ref($val) eq 'ARRAY' ) { print "@$val\n"; } else { # assume scalar as we are not dealing with other case # will stringify exceptions..... print $val, $/; } } __DATA__ $VAR1 = { 'key1' => 'val1', 'key2' => { 'hash_ref2' => 'val2' }, 'key3' => { 'hash_ref3' => { 'real_deep' => { 'diving' => 'now' }, 'deeper' => 'deep' } }, 'key4' => [ 'array ref1', 'array_ref2' ] }; val1 val2 now deep array ref1 array_ref2