对哈希的arrayref进行排序

时间:2012-03-05 14:30:06

标签: perl sorting perl-data-structures

我在尝试根据散列中的值对哈希的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!

3 个答案:

答案 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 ) {
.....
}