1
我的問題很簡單。我必須從散列中打印一些鍵值對。我嘗試了兩種不同的方法:不同的結果迭代在Perl中的散列
方法
#Fill hash from file ($fh has been defined previously)
while(my $line = <$fh>) {
$counter{$line}++;
}
foreach (my($k, $v) = each %counter){
my ($p1, $p2) = split(/$;/o, $k);
chomp $p2;
if($v > 0){
printf "%s_down_%s %s %d\n", $prefix, $p1, $p2, $v;
printf "%s_up_%s %s %d\n", $prefix, $p2, $p1, $v;
}
}
方法B
#Fill hash from file ($fh has been defined previously)
while(my $line = <$fh>) {
$counter{$line}++;
}
foreach $k (keys %counter) {
my ($p1, $p2) = split(/$;/o, $k);
my $v = $counter{$p1,$p2};
chomp $p2;
if($v > 0){
printf "%s_down_%s %s %d\n", $prefix, $p1, $p2, $v;
printf "%s_up_%s %s %d\n", $prefix, $p2, $p1, $v;
}
}
讀碼,我會說這兩種方法獲得相同的結果,但是,執行後它,方法B,得到正確的結果和方法A只印兩個元素( 4行)。
運行方法A幾次後,我可以看到打印的元素改變了每次執行。
有人知道這裏發生了什麼嗎?
@IvánRodríguezTorres更新了答案,無論是通過編輯第一個例子和說明,並添加一個更好的例子。結果當然是一樣的:「for」是錯誤的,需要使用'while'。但是,爲了解釋使用'for'時的行爲,還有更多。感謝您的歸屬。 – zdim
你的回答非常明確,一如既往。謝謝。 –
@IvánRodríguezTorres很高興幫助並感謝您的評論。很高興與你互動:) – zdim