如果我有一个包含一堆(键、值)对的Perl散列,那么迭代所有键的首选方法是什么?我听说使用each
在某种程度上可能会有意想不到的副作用。那么,这是真的吗,以下两种方法中的一种是最好的,还是有更好的方法?
# Method 1
while (my ($key, $value) = each(%hash)) {
# Something
}
# Method 2
foreach my $key (keys(%hash)) {
# Something
}
发布于 2008-09-16 14:35:44
each
可能会给您带来问题的地方在于它是一个真正的、无范围的迭代器。举个例子:
while ( my ($key,$val) = each %a_hash ) {
print "$key => $val\n";
last if $val; #exits loop when $val is true
}
# but "each" hasn't reset!!
while ( my ($key,$val) = each %a_hash ) {
# continues where the last loop left off
print "$key => $val\n";
}
如果您需要确保each
获得所有键和值,则需要确保首先使用keys
或values
(因为这会重置迭代器)。请参阅documentation for each。
发布于 2008-09-11 22:04:22
使用each语法将防止一次生成整个密钥集。如果您对包含数百万行的数据库使用绑定散列,这一点可能很重要。您不希望一次性生成整个密钥列表并耗尽您的物理内存。在这种情况下,每个键都充当迭代器,而键实际上在循环开始之前生成整个数组。
因此,“每个”唯一真正有用的地方是当散列非常大的时候(与可用内存相比)。只有当散列本身不在内存中时,这种情况才可能发生,除非您正在对手持数据收集设备或内存较小的设备进行编程。
如果记忆不是问题,那么通常情况下,map或key范例是更流行和更容易阅读的范例。
发布于 2008-08-06 03:43:59
我可能会被这个问题所困扰,但我认为这是个人喜好。我在文档中找不到任何关于each()与key()或values()不同的引用(除了明显的“它们返回不同的东西”的答案)。事实上,文档声明使用相同的迭代器,并且它们都返回实际的列表值,而不是它们的副本,并且在使用任何调用迭代时修改散列表值是不好的。
尽管如此,我几乎总是使用key(),因为对我来说,通过散列本身访问键值通常更具自我文档性。当值是对大型结构的引用,并且散列的键已经存储在结构中时,我偶尔会使用values(),此时键是多余的,我不需要它。我想我在10年的Perl编程中使用了2次each(),这可能是错误的选择,这两次都是=)
https://stackoverflow.com/questions/3033
复制相似问题