我基本上想要这样做:
foreach my $key (keys $hash_ref) {
Do stuff with my $key and $hash_ref
# Delete the key from the hash
delete $hash_ref->{$key};
}
安全吗?为什么?
答案 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
然后继续处理这个预先生成的列表,无论你在实际哈希内部改变了什么。
它会占用你的记忆,因为你保留了整个清单,直到你完成。