2013-01-16 184 views
0

我真的需要一些幫助來理解這個哈希和排序處理它。多維哈希排序 - Perl

這裏是哈希:

$VAR1 = { 

    Key1:Key1_si => { 

     'KeyA' => { 
      Keya => 'abcd, defg', 
      keyb => '1000', 
      keyc => '80%', 
      keyd => '2011.10.09', 
      keye => '1234-UR-DDDD', 
      keyf => 'rwh', 
      keyg => '600', 
      keyh => 'red', 
      keyi => '900', 
      keyj => '', 
      keyk =>'int4678_tt', 
     }, 

     'KeyB' => { 

      Keya => 'abcd, defg', 
      keyb => '2000', 
      keyc => '100%', 
      keyd => '2011.11.09', 
      keye => '1234-UR-DDDD', 
      keyf => 'rwh', 
      keyg => '500', 
      keyh => 'red', 
      keyi => '400', 
      keyj => '', 
      keyk =>'int4678_tt', 
     }, 
    }, 

}; 

問:我想排序,其值是不同的「keyc」的基礎上,該散列。所以,我要排序的基礎上,如下圖所示:

Key1:Key1_si->KeyB->Keyc 

Key1:Key1_si->KeyA->keyc 

另外,我想和排序值的輸出與類似屬性的其他部分一起:

打印:

Key1:Key1_si KeyB Keya keyd Keyc keyf 

Key1:Key1_si KeyA keya keyd Keyc keyf 

有人可以幫我用perl中的代碼來執行上述的排序。我會非常感謝你的時間和努力。

+3

哈希表不能進行排序。您可以按給定順序輸出哈希的內容,方法是按照您選擇的順序遍歷其中的鍵,但是哈希本身的內容沒有排序。這是一包不確定的訂單。 –

+0

你知道任何Perl嗎?如果您已盡力解決問題,但無法進一步發展,我們將在此爲您提供幫助,但本網站不是免費的編程服務。您至少應該向我們展示一些代碼以顯示您嘗試過的內容。 – Borodin

+0

我試圖與2個代碼: – user1985039

回答

3

要排序的密鑰對的列表,所以你必須通過構建密鑰對的列表開始。對數組的引用是明顯的答案。一旦你明白了這一點,一切都很簡單。

建立密鑰列表:

my @unsorted_keys; 
for my $k1 (keys(%$VAR1)) { 
    for my $k2 (keys(%{ $VAR1->{$k1} })) { 
     push @unsorted_keys, [ $k1, $k2 ]; 
    } 
} 

排序的關鍵:

my @sorted_keys = sort { 
    my ($a_k1, $a_k2) = @$a; 
    my ($b_k1, $b_k2) = @$b; 

    (my $a_pc = $VAR1->{$a_k1}{$a_k2}{keyc}) =~ s/%//; 
    (my $b_pc = $VAR1->{$b_k1}{$b_k2}{keyc}) =~ s/%//; 

    $a_pc <=> $b_pc 
} @unsorted_keys; 

遍歷排序鍵:

for (@sorted_keys) { 
    my ($k1, $k2) = @$_; 
    my $hash = $VAR1->{$k1}{$k2}; 
    ... do stuff with %$hash ... 
} 
+0

首先非常感謝這個解釋ikegami很多。讓我試試這個,不管我能否得到它,我都會回覆你。非常感謝您的幫助並讓我明白。 – user1985039

+0

這是假設頂層可以有多個鍵。如果只有一個(即使它不總是'Key1:Key1_si'),這會大大簡化。 – ikegami

+0

是的,有多個密鑰是key1:key1_s1。我仍在努力。當我完全執行你的解釋後,我回來時請回復。這真的對你很好。謝謝,克里希納 – user1985039