use warnings; use strict; my %temp = ( "0x55555555" => { "0x55555555" => [ [ "0xAAAAAAAA", "0x9" ], ], "0xAAAAAAAA" => [ [ "0xAAAAAAAA", "0x8" ], ], }, "0xAAAAAAAA" => { "0x55555555" => [ [ "0xFFFFFFFF", "0x8" ], ], "0xAAAAAAAA" => [ [ "0x55555554", "0x3" ], ], }, ); foreach my $item ( keys %temp ) { print "$item: \n"; # print keys my $hash = $temp{$item}; foreach my $key2 ( keys %$hash ) { print "\t", $key2, "\n\t"; # print keys my $array = $hash->{$key2}; print "\t", join "\t", map { @$_ } @$array; # print all your values print "\n"; } }