I have a hash %d,i want the top five valued keys.I did the following wich worked but is there anything more effecient? `@p=(reverse sort{\$d{\$a}<=>\$d{\$b}} keys%d)[0..4];`

d5e5 commented: Good question. I think the answer is 'no' but I can't prove it. +9

We can take the greatest five from a hash without sorting. I don't know if that makes it more efficient. For example, the following prints the five colors having the longest wavelengths.

``````#!/usr/bin/perl
use strict;
use warnings;

my %d = (violet => 400,
red    => 650,
indigo …``````

## All 4 Replies

We can take the greatest five from a hash without sorting. I don't know if that makes it more efficient. For example, the following prints the five colors having the longest wavelengths.

``````#!/usr/bin/perl
use strict;
use warnings;

my %d = (violet => 400,
red    => 650,
indigo => 445,
orange => 590,
blue   => 475,
yellow => 570,
green  => 510);

my @p;

foreach my \$r (0 .. 4){
foreach my \$k (keys %d){
if (!defined\$p[\$r]
or \$d{\$k} > \$d{\$p[\$r]}){
\$p[\$r] = \$k;
}
}
delete \$d{\$p[\$r]};#After saving one of top 5, delete it from hash
}

print join "\n", @p;``````

Thanks for the tip,haven't thought of that.Is there more effecient performance wise?

``````use Sort::Key::Top qw(rnkeytop);
my @top = rnkeytop { \$d{\$_} } 5 => keys %d;``````