我有相當大的散列(一些10M鍵),我想從中刪除一些元素。如何在迭代時刪除散列元素?
我通常不喜歡使用delete
或splice
,我最終複製了我想要的而不是刪除我不想要的東西。但是這一次,由於散列非常大,我想我想直接從它中刪除。
所以我在做這樣的事情:
foreach my $key (keys %hash) {
if (should_be_deleted($key)) {
delete($hash{$key});
}
}
而且它似乎工作確定。但是..如果我想在迭代它們之前刪除一些元素呢?我將舉例說明:
foreach my $key (keys %hash) {
if (should_be_deleted($key)) {
delete($hash{$key});
# if $key should be deleted, so does "$key.a", "kkk.$key" and some other keys
# I already know to calculate. I would like to delete them now...
}
}
我想一些可能的解決方案 - 比如檢查是否有鍵仍然存在,如在環或第一循環的第一步,創建密鑰的列表中刪除(並沒有實際刪除他們),然後在另一個循環中實際刪除。
您對此有何看法?
UPDATE
這似乎是雙通的辦法有一個共識。然而,從第一遍的過程中我仔細檢查已經標記爲刪除的鍵是非常低效的。這是有點遞歸的,因爲不僅我檢查了密鑰,還計算了應該刪除的其他密鑰,儘管它們已經由原始密鑰計算出來了。
也許我需要使用一些更加動態的數據結構遍歷鍵,將動態更新?
***「我仔細檢查按鍵之前所有的哈希鍵的列表那已經標記爲刪除「***看到我的解決方案節儉的替代 – Borodin 2015-07-11 15:20:04