Your input data ($VAR1) is an invalid hashref and your example output is not sorted.
After fixing the input and guessing you want highest score first, this code:
#!/usr/bin/env perl
use strict;
use warnings;
my $data = {
'dove-n' => {
'mero' => {
'rump-n' => '0.0986331918077933',
'plume-n' => '0.164895598193776',
'beak-n' => '0.148781820621755',
'head-n' => '0.541972342596793',
},
'random-v' => {
'pile-v' => '0.0060585514167655',
'kiss-v' => '0.00527768217153647',
},
},
'cockroach-n' => {
'mero' => {
'exoskeleton-n' => '0.0665736517016939',
'leg-n' => '0.440277128001941',
},
'random-v' => {
'suggest-v' => '0.0148588863336517',
'guarantee-v' => '0.00591007188858908',
'land-v' => '0.0149882471117093',
},
},
};
for my $animal (keys %$data) {
my @record = ();
for my $type (keys %{$data->{$animal}}) {
for my $part (keys %{$data->{$animal}{$type}}) {
push @record, [$animal, $type, $part, $data->{$animal}{$ty
+pe}{$part}];
}
}
map { print join(q{ } => @$_), qq{\n} } sort { $b->[3] <=> $a->[3]
+ } @record;
}
produces this output:
dove-n mero head-n 0.541972342596793
dove-n mero plume-n 0.164895598193776
dove-n mero beak-n 0.148781820621755
dove-n mero rump-n 0.0986331918077933
dove-n random-v pile-v 0.0060585514167655
dove-n random-v kiss-v 0.00527768217153647
cockroach-n mero leg-n 0.440277128001941
cockroach-n mero exoskeleton-n 0.0665736517016939
cockroach-n random-v land-v 0.0149882471117093
cockroach-n random-v suggest-v 0.0148588863336517
cockroach-n random-v guarantee-v 0.00591007188858908
The technique I've used here is to flatten the hash data into individual records and then sort those records.
To reverse the sort order (lowest score first), just swap $a and $b, i.e.
... sort { $a->[3] <=> $b->[3] } ...
|