我基本上想要做到这一点:
foreach my $key (keys $hash_ref) {
Do stuff with my $key and $hash_ref
# Delete the key from the hash
delete $hash_ref->{$key};
}
这是安全的吗?为什么?
你没有遍历哈希表本身,而是在循环之前就遍历了由 keys
返回的键列表。请记住:
for my $key (keys %$hash_ref) {
...
}
大致相等于
my @anon = keys %$hash_ref;
for my $key (@anon) {
...
}
从哈希表中删除元素不会出现任何问题。
each
会对哈希表进行迭代。每次调用 each
,都会返回一个不同的元素。尽管如此,删除当前元素仍然是安全的!
# Also safe
while (my ($key) = each(%$hash_ref)) {
...
delete $hash_ref->{$key};
...
}
在遍历hash时,如果你添加或删除其中的元素,可能会跳过或重复条目--所以不要这样做。例外情况:始终可以安全地删除由each()最近返回的项。
这是安全的,因为keys %hash
一次性提供整个列表,然后您开始迭代。然后foreach
继续在此预生成的列表上工作,无论您在实际哈希表内部更改了什么。
但它会占用您的内存,因为您保留整个列表直到完成。
each()
,而是使用 foreach 键就可以了。 - LeoNerduse feature
或其他类似的编译指示的情况下被改变。 - Oleg V. Volkov