#!/usr/bin/perl use strict; use warnings; my %h = ( a=>{ a=>1, b=>2, c=>3, d=>4 }, b=>{ h=>5, i=>6, j=>5 }, c=>{ r=>5, s=>5, t=>5 }, e=>{ r=>5, s=>5, t=>4 }, ); for my $k (sort keys %h) { my @t = kv_for_largest_v($h{$k}); print "Key $k: $t[0], $t[1]\n"; } sub kv_for_largest_v { my $hr = shift; return undef unless keys %$hr; my ($k,$v) = each %$hr; while (my ($k2,$v2) = each %$hr) { ($k,$v) = ($k2,$v2) if $v2>$v; } return $k,$v; }