my %HoH = ( "a" => { "value1" => "foo", "value2" => "1"}, "e" => { "value1" => "bar", "value2" => "2"}, "b" => { "value1" => "foo", "value2" => "2"}, "f" => { "value1" => "bar", "value2" => "2"}, "d" => { "value1" => "foo", "value2" => "3"}, "c" => { "value1" => "bar", "value2" => "5"}, "h" => { "value1" => "foo", "value2" => "4"}, "g" => { "value1" => "foo", "value2" => "4"} ); foreach my $key (sort { $HoH{$key}->{"value2"}{$b} <=> $HoH{$key}->{"value2"}{$a} || $a cmp $b } keys %HoH ) { my $v1 = $HoH{$key}{"value1"}; my $v2 = $HoH{$key}{"value2"}; printf "%s has v1=%s and v2=%d\n", $key, $v1, $v2; }