2012-03-05 4 views
0

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

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

Определите '' возвращайтесь '', пожалуйста. Вы имеете в виду, что вы напечатали значения внутри цикла? – TLP

ответ

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

+0

Спасибо Axeman, именно то, что мне нужно. Извините за вопрос, это был только я, набрав какой-то код и скопировав и вставив другой. Еще раз спасибо! – Analog

+0

@ Анолог, рад, что смогу помочь. Забавно, что в последнее время я немного программировал .NET (cap city), и я сразу не заметил проблему с кепкой. – Axeman

2

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

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

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

my @sorted = sort { $a->{name} cmp $b->{name} } @$users; 
+0

Спасибо за подсказку! – Analog

-1

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

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

'$ users -> [$ a]' даст ошибку «Использование ссылки в качестве индекса массива», потому что '@ $ users' не является списком индексов. – TLP