use strict; use warnings; my %h1=('qwqw' => {'qw' => 'qww','df' => 'dfff'},); my %hash=( 'AAA' => 'aaa', 'BBB' => 'bbb', 'CCC' => {'A1' => 'a1','B1' => 'b1','C1' => {'A2' => 'a2','B2' => 'b2','C2' => 'c2END'}}, 'DDD' => 'ddd', 'EEE' => \%h1, 'FFF' => 'sdsfsds', ); ddump (\%hash); sub ddump { my $ref = shift; my $deep = shift||0; foreach my $k (sort keys %{$ref}) { if (ref( ${$ref}{$k})) {print "\t" x $deep."$k =>\n"; &ddump (${$ref}{$k}, ($deep+1))} # key and value # else {print "\t" x ($deep)."$k => ${$ref}{$k}\n";} # or just the key as your need else {print "\t" x ($deep)."$k\n";} } } # OUTPUT AAA BBB CCC => A1 B1 C1 => A2 B2 C2 DDD EEE => qwqw => df qw FFF