2016-03-03 66 views
-5

我有一個具有重複值和唯一鍵的散列。我必須將鍵存儲在大小爲5的數組中,如果更多鍵存在,則應該創建並存儲新數組。 存儲在1個數組中的鍵應具有相同的值。如何將數組中的哈希值存儲在perl中?

注:我必須從excel表中讀取這些值並生成c源文件。

例如: %散列=(a => 1,b => 2,c => 1,d => 1,e => 3,f => 4,g => 4,h => 1 ,I => 1,J => 1);

輸出C文件:

datatype arr1[]={a,c,d,h,i}; 
datatype arr2[]={j}; 
datatype arr3[]={b}; 
datatype arr4[]={e}; 
datatype arr5[]={f,g}; 
+1

重新「*我有一個散列有重複鍵*」,這是不可能的。這就像有人說他們有一個重複索引的數組。 – ikegami

+0

這就是爲什麼我做了相反的重複值和唯一鍵。這些值我必須從Excel表讀取。 – jsr

+0

請通過編輯修復問題,而不是添加評論。 – ikegami

回答

0

所以,你需要找到具有相同值的鍵?

所以我們需要恢復數組,但是要處理原始值不是唯一的。 Som而不是隻是將'key'=>'value'對轉換爲'value'=>'key',我們需要將這些鍵存儲在數組中。

my %hash = ...; 

my %transposed; 
for my $key (keys %hash) { 
    my $value = $hash{$key}; 

    $transposed{$value} = [] unless defined $transposed{$value}; 
    push @{ $transposed{$value} }, $key; 
} 

然後,你必須陣列的散列,其中,每個關鍵是在原始散列和一個值的數組的元素是關鍵。下一步是遍歷鍵和灑每個列表到5個元素的行:

for my $key (sort keys %transposed) { 
    while (@{ $transposed{$key} }) { 
     my @list = splice @{ $transposed{$key} }, 0, 5; 
     say join ", ", @list; 
    } 
} 

主要部分是while循環,只要有在當前的列表元素和拼接移除並返回迭代每次迭代最多5個元素。加準確的C代碼作爲練習留給有興趣的讀者... :-)

您可能需要在參考閱讀起來:http://perldoc.perl.org/perlreftut.html

行的哈希值設置爲參考爲空數組不是必需的,因爲當你試圖向它推送一個值時,perl會自動創建一個arrayref。我已經將它包括在內,以更清楚地說明發生了什麼。