use strict; use warnings; my %data = ( 1 => { a => 10, b => 5, c => 20 }, 2 => { a => 90, b => 15, c => 40 } ); my @top_3 = ( sort { $a->[-1] <=> $b->[-1] } map { my $k = $_; my $h = $data{ $_ }; map [ $k, $_, $h->{$_} ], keys %$h } keys %data )[ 0..2 ]; for ( @top_3 ) { printf "\$data{%d}{%s} = %d\n", $_->[0], $_->[1], $data{$_->[0]}{$_->[1]}; } __END__ $data{1}{b} = 5 $data{1}{a} = 10 $data{2}{b} = 15