2012-03-05 127 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 2012-03-05 14:49:50

回答

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 2012-03-05 15:24:07

+0

@Analog,很高興我能幫上忙。有趣的是,我最近一直在做一些.NET編程(上限城市),我沒有立即注意到上限問題。 – Axeman 2012-03-05 16:04:03

2

sort函數接收一個可根據需要進行調整的塊。兩個隱式變量($a$b)用於指示排序的'左'和'右'值。因此,下面的代碼應該做你需要的東西:

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

,這將通過名稱排序(注意cmp運營商,而不是飛船運營商):

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

感謝您的名字提示! – Analog 2012-03-05 15:25:26

-1

Perl是區分大小寫。嘗試:

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

'$ users - > [$ a]'會給出錯誤'Use of reference as array index',因爲'@ $ users'不是索引列表。 – TLP 2012-03-05 15:03:42