# Read in test data. while () { my ( $k1, $k2, $v ) = split; $hash{$k1}{$k2}[0] = $v } # Make an array of all key pairs. my @key_pairs; foreach my $k1 ( keys %hash ) { foreach my $k2 ( keys %{$hash{$k1}} ) { push @key_pairs, [$k1, $k2]; } } # Sort key pairs my @key_pairs_by_value = sort { $hash{ $b->[0] }{ $b->[1]}[0] <=> $hash{ $a->[0] }{ $a->[1]}[0] } @key_pairs; # print sorted for my $keys ( @key_pairs_by_value ){ my ($colour, $device) = @$keys; printf("\n%-55s %-55s %-40s", $colour, $device, $hash{$colour}{$device}[0] ); }