I have a hash which is shown below. I want list of keys
in sorted (ascending) order based on their values
.
If the two different keys have same values, then it should print keys
which is less first.
Let me show what's going wrong in my example:
#!/usr/bin/perl
use strict; use warnings;
use Data::Dumper;
my %hash = (
'11' => 1,
'315' => 4,
'27' => 3,
'60' => 4,
'8' => 3,
'4' => 2
);
my @keys = sort { $hash{$a} <=> $hash{$b} } keys(%hash);
print Dumper(\@keys);
Current Output:
$VAR1 = [
'11',
'4',
'27',
'8',
'315',
'60'
];
I want this to printed like below:
$VAR1 = [
'11',
'4',
'8',
'27',
'60',
'315'
];
Since 60
's value is 4
and 315
's value is also 4
. I want 60
to be printed first and 315
later since 60
is lesser than 315
(I mean based on the key
's value).
Just assuming this can be done using Tie::SortHash
(not sure)?
Change the sort to sort numerically on values, then on keys:
my @keys = sort {
$hash{$a} <=> $hash{$b}
or
$a <=> $b
} keys(%hash);
Output:
$VAR1 = [
'11',
'4',
8,
27,
60,
315
];
Refer to perlfaq4
: How do I sort a hash (optionally by value instead of key)?
From your command line, you can look up common questions with a command like:
perldoc -q sort