在我循环使用相同的哈希时,在Perl中从哈希引用中删除密钥是否安全?为什么?

时间:2012-06-01 16:12:34

标签: perl hash key

我基本上想要这样做:

foreach my $key (keys $hash_ref) {

    Do stuff with my $key and $hash_ref

    # Delete the key from the hash
    delete $hash_ref->{$key};
}

安全吗?为什么?

2 个答案:

答案 0 :(得分:17)

你没有迭代哈希,你甚至在开始循环之前迭代keys返回的键列表。请记住

for my $key (keys %$hash_ref) {
   ...
}

大致相同
my @anon = keys %$hash_ref;
for my $key (@anon) {
   ...
}

从哈希中删除不会造成任何问题。


另一方面,

each会迭代哈希。每次调用时,each都会返回不同的元素。然而,delete当前元素仍然是安全的!

# Also safe
while (my ($key) = each(%$hash_ref)) {
   ...
   delete $hash_ref->{$key};
   ...
}
  

如果在迭代时添加或删除哈希的元素,则可能会跳过或复制条目 - 所以不要这样做。例外:删除每个()

最近返回的项目总是安全的

答案 1 :(得分:3)

这是安全的,因为keys %hash在开始迭代之前提供一次完整列表。 foreach然后继续处理这个预先生成的列表,无论你在实际哈希内部改变了什么。

它会占用你的记忆,因为你保留了整个清单,直到你完成。