我在尝试根据散列中的值对哈希的arrayref进行排序时遇到了麻烦,数据结构如下所示:
my %usera = (name => 'tom',
weight=> 10);
my %userb = (name => 'harry',
weight=> 1);
my %userc = (name => 'peter',
weight=> 5);
my $users = [];
push(@$users,\%usera,\%userb,\%userc);
我想按重量降序对结果进行排序,所以它会按照“汤姆,彼得,哈利”的顺序排列,但我没有太多运气。我试过了:
for my $user (sort{ $users->[$a]{'Weight'} <=> $users->[$b]{'Weight'} } @$users){
.....
}
我认为可能有用,但没有爱。
有什么想法吗?
TIA!
答案 0 :(得分:5)
如果您要对@$users
进行排序,则您的流水线数据来自元素而不是下标。因此,索引到$users->[$x]
是完全没必要的,更不用说错误的。如果您使用过warnings
,则会看到Use of reference "HASH(0x2c201e0)" as array index at ...
将您的排序更改为:
use warnings;
foreach my $user (sort { $b->{weight} <=> $a->{weight} } @$users ) {
...
}
另外,正如其他地方所提到的,Perl哈希区分大小写。 $h->{Weight}
和$h->{weight}
是两个不同的哈希位置。
答案 1 :(得分:2)
sort
函数会收到一个可以根据您的需要进行调整的块。两个隐式变量($a
和$b
)用于指示排序的“左”和“右”值。因此,以下代码应该满足您的需求:
my @sorted = sort { $b->{weight} <=> $a->{weight} } @$users;
这将按名称排序(请注意cmp
运算符,而不是太空飞船运算符):
my @sorted = sort { $a->{name} cmp $b->{name} } @$users;
答案 2 :(得分:-1)
Perl区分大小写。尝试:
foreach my $user (sort { $users->[$a]{'weight'} <=> $users->[$b]{'weight'} } @$users ) {
.....
}