2015-12-22 40 views
0

衆所周知如何遍歷在Perl的散列(參見,例如,What's the safest way to iterate through the keys of a Perl hash?)。但是,鍵和值的順序是不確定的,事實上perl腳本的每次運行都不相同。同步複製過迭代散列在Perl

有沒有一種方法,以確保相同的Perl腳本的在同一迭代順序相同的輸入數據結果每一次運行?在這個意義上,我只關心可複製性 - 命令不需要由人來預測。

編輯:我制定迭代方面的問題,但也許還沒有結束的散列但散列建設過程,是不確定性的迭代。我可以設置一些初始化以確定性和可複製的方式構建散列嗎?

+0

'該命令不需要人類可以預測'如何將鍵序列插入散列中? –

+0

@Сухой27:沒問題,這個訂單和任何**固定訂單一樣好。 – jknappen

回答

6

sort他們先:

foreach my $key ( sort keys %hash) { 

} 

注:默認排序是按字母順序排列,而不是數字。但sort將採取自定義功能,讓您按幾乎任何您關心的名字排序。

或者,捕獲數組中的排序並使用來提取輸出順序。

my %content_for; 
my @ordered_id; 

while (<$input_filehandle>) { 
    my ($id, $content) = split; 
    push (@ordered_id, $id); 
    $content_for{$id} = $content; 
} 

print join ("\n", @content_for{@ordered_id}),"\n" 

;

或者類似的東西有序散列機制像Hash::OrderedTie::IxHash

我用迭代的方式提出了問題,但它可能不是對散列的迭代,而是非確定性的散列構建過程。我可以設置一些初始化以確定性和可複製的方式構建散列嗎?

不,哈希不起作用。有關說明,請參閱 - perlsec。它得到了隨機用Perl的新版本,但它一直是一個無序的數據結構。

你也許可以弄亂(如文章中提到的)PERL_HASH_SEEDPERL_PERTURB_KEYS,但這絕對不是一個好習慣。

PERL_HASH_SEED=0 ./somescript.pl 

但是你應該記住,哈希排序仍不能保證承擔 - 按鍵的排序仍然可以改變。它會比以前更加一致。在生產中使用這絕對不是一件好事,或者除了調試之外都依賴它。

請注意:散列種子是敏感信息。哈希被隨機化以防範針對Perl代碼的本地和遠程攻擊。通過手動設置種子,這種保護可能會部分或完全丟失。

+0

:)你只是打敗了我幾秒鐘:)'排序'可能是實現這一目標的唯一方法。 – Samiron

+1

這是簡單的答案,但也有其他人 - 如使用'哈希:: Ordered'這...基本上建立在'sort'。 – Sobrique

+0

這是一個很好的答案,但是真的沒有其他選擇,比如設置一些初始化以使哈希可重現? – jknappen