my %hash = ( APP1 => { error => { 6001 => 10, 6002 => 15, 6003 => 25, }, alert => { 1001 => 2, 1005 => 200, }, warning => { 0022 => 10, }, }, APP2 => { error => { 6001 => 4, 6004 => 21, }, alert => { 1002 => 3, 1005 => 165, }, }, ); my %revhash; for my $key1 (keys %hash) { for my $key2 (keys %{$hash{$key1}}) { push @{$revhash{$hash{$key1}{$key2}{$_}}}, $key1.":".$key2.":".$_ for keys %{$hash{$key1}{$key2}}; } } my $cnt; for my $key (sort { $b <=> $a } keys %revhash) { for (@{$revhash{$key}}) { printf "%3d %3d %s\n", $cnt, $key, $_ if ++$cnt <= 5; } }