Сортировка массива по хэшам - PullRequest
0 голосов
/ 05 марта 2012

У меня возникают проблемы при попытке отсортировать массив хэшей на основе значения в хэше, структура данных выглядит следующим образом:

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 ]

5 голосов
/ 05 марта 2012

Если вы сортируете @$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} - два разных слота хеша.

2 голосов
/ 05 марта 2012

Функция sort получает блок, который можно настроить в соответствии с вашими потребностями. Две неявные переменные ($a и $b) используются для указания «левых» и «правых» значений для сортировки. Таким образом, следующий код должен делать то, что вам нужно:

my @sorted = sort { $b->{weight} <=> $a->{weight} } @$users;

И это будет сортировать по имени (обратите внимание на оператор cmp вместо оператора космический корабль ):

my @sorted = sort { $a->{name} cmp $b->{name} } @$users;
0 голосов
/ 05 марта 2012

Perl чувствителен к регистру.Попробуйте:

foreach my $user (sort { $users->[$a]{'weight'} <=> $users->[$b]{'weight'} } @$users ) {
.....
}
...