2012-01-08 204 views
2

在Perl中,我有一個哈希看起來像以下:嵌套哈希排序哈希鍵

$hash{key1}->{a} = 1; 
    $hash{key1}->{b} = 3; 

    $hash{key2}->{a} = 4; 
    $hash{key2}->{b} = 7; 

    $hash{key3}->{a} = 2; 
    $hash{key3}->{b} = 5; 

我如何通過的關鍵a值這個哈希鍵排序。例如,通過鍵a的值以數字升序對上述散列進行排序將給出:key1,key3,key2。

+0

遵守「箭頭規則」['perldoc perlreftut'](http://perldoc.perl.org/perlreftut.html#Arrow-Rule)你不需要任何' - >'在你的例子中。這使得看起來更清晰的多級哈希。 – 2012-01-09 15:27:06

+1

@JoelBerger:你覺得刪除 - >讓表達更具可讀性,這很有趣。我已經知道在一個複雜表達式的組件之間引入 - 僅僅出於同樣的原因:使它更易讀。我猜可讀性是在旁觀者的眼中:) – 2012-01-09 18:47:35

+0

@PrakashK,絕對是旁觀者的眼睛。我的經驗法則通常是:沒有純粹的數據結構箭頭(特別是HoH或AoA等同類型的箭頭),總是用於子程序調用/解引用的箭頭以及任何其他更清晰的箭頭。 – 2012-01-10 00:42:41

回答

4

Perl有沒有一個排序的散列的概念,你必須「排序」你在foreach循環鍵:

#!/usr/bin/perl -W 
use strict; 

my %hash =(); 

$hash{key1}->{a} = 1; 
$hash{key1}->{b} = 3; 

$hash{key2}->{a} = 4; 
$hash{key2}->{b} = 7; 

$hash{key3}->{a} = 2; 
$hash{key3}->{b} = 5; 

print "$_\n" foreach sort {$hash{$a}->{a} <=> $hash{$b}->{a}} keys %hash; 

或者,你可以把sort的結果在一個數組和循環在這個數組上。

+0

謝謝fge。這工作完美。我操縱了這個語句:'foreach my $ key(sort {$ hash {$ a} - > {'a'} <=> $ hash {$ b} - > {'a'}} keys%hash){... }'。 – user001 2012-01-08 23:12:55