2013-10-28 38 views
1

排序包含爲了根據給定一個數組給定鍵順序

我的$ ORD =( 「USA」, 'IN', 「澳大利亞」, 「新西蘭」, 「新經濟政策」, 「CHN」, 「ARG」, 「UK」);

同時,我們也給出哈希:

my %hash = ("IN" => 'val1', "AUS" => 'val2', 
      "USA" => 'val3', "UK" => 'val4', 
      "CHN"=>'val5',"UK"=>'val6', 
       "NZ"='val7',"IN"=>'val8', 
       "NEP"=>'val9',ARG=>'val10', 
       "IN"=>'val11'); 

我們要排序的關鍵在$ ORD秩序的基礎上,該散列。

即排序後,輸出應該是:

"USA"=>'val3' 
"IN"=>'val1' 
"IN"=>'val8' 
"IN"=>'val11' 
........ 
....... 
"UK"=>'val4' 

有一個簡單的辦法做到這一點在Perl?或者,我是否需要自己寫這樣的功能?

+1

請顯示您嘗試過的例子。雖然我可以提供答案。很高興看到至少有一些嘗試或嘗試從用戶的問題。一旦您提供了您所嘗試的代碼示例,我很樂意展示解決方案並解釋其中的差異。 –

+0

你的'%hash'在其中有幾個語法錯誤 –

+6

正如@TomFenech所提到的,你的散列賦值在語法上被破壞了('「NZ」='val7')......但是,在語法之外,單鍵不會被正確存儲。 我想看看http://bioinfo2.ugr.es/documentation/Perl_Cookbook/ch05_08.htm – admdrew

回答

3

你的散列不能包含兩個(或三個)具有相同鍵的元素。最好創建一個數組散列。

my @data = (
    IN => 'val1', 
    AUS => 'val2', 
    USA => 'val3', 
    UK => 'val4', 
    CHN => 'val5', 
    UK => 'val6', 
    NZ => 'val7', 
    IN => 'val8', 
    NEP => 'val9', 
    ARG => 'val10', 
    IN => 'val11', 
); 

my @order = qw(USA IN AUS NZ NEP CHN ARG UK); 

my %vals_by_country; 
while (@data) { 
    my $country = shift(@data); 
    my $val  = shift(@data); 

    push @{ $vals_by_country{$country} }, $val; 
} 

for my $country (@order) { 
    if (my $vals = $vals_by_country{$country}) { 
     for my $val (@$vals) { 
     print("$country: $val\n"); 
     } 
    } 
}