首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >迭代Perl散列的键的最安全方法是什么?

迭代Perl散列的键的最安全方法是什么?
EN

Stack Overflow用户
提问于 2008-08-06 02:53:13
回答 5查看 125.2K关注 0票数 111

如果我有一个包含一堆(键、值)对的Perl散列,那么迭代所有键的首选方法是什么?我听说使用each在某种程度上可能会有意想不到的副作用。那么,这是真的吗,以下两种方法中的一种是最好的,还是有更好的方法?

代码语言:javascript
复制
# Method 1
while (my ($key, $value) = each(%hash)) {
    # Something
}

# Method 2
foreach my $key (keys(%hash)) {
    # Something
}
EN

回答 5

Stack Overflow用户

发布于 2008-09-16 14:35:44

each可能会给您带来问题的地方在于它是一个真正的、无范围的迭代器。举个例子:

代码语言:javascript
复制
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获得所有键和值,则需要确保首先使用keysvalues (因为这会重置迭代器)。请参阅documentation for each

票数 21
EN

Stack Overflow用户

发布于 2008-09-11 22:04:22

使用each语法将防止一次生成整个密钥集。如果您对包含数百万行的数据库使用绑定散列,这一点可能很重要。您不希望一次性生成整个密钥列表并耗尽您的物理内存。在这种情况下,每个键都充当迭代器,而键实际上在循环开始之前生成整个数组。

因此,“每个”唯一真正有用的地方是当散列非常大的时候(与可用内存相比)。只有当散列本身不在内存中时,这种情况才可能发生,除非您正在对手持数据收集设备或内存较小的设备进行编程。

如果记忆不是问题,那么通常情况下,map或key范例是更流行和更容易阅读的范例。

票数 14
EN

Stack Overflow用户

发布于 2008-08-06 03:43:59

我可能会被这个问题所困扰,但我认为这是个人喜好。我在文档中找不到任何关于each()与key()或values()不同的引用(除了明显的“它们返回不同的东西”的答案)。事实上,文档声明使用相同的迭代器,并且它们都返回实际的列表值,而不是它们的副本,并且在使用任何调用迭代时修改散列表值是不好的。

尽管如此,我几乎总是使用key(),因为对我来说,通过散列本身访问键值通常更具自我文档性。当值是对大型结构的引用,并且散列的键已经存储在结构中时,我偶尔会使用values(),此时键是多余的,我不需要它。我想我在10年的Perl编程中使用了2次each(),这可能是错误的选择,这两次都是=)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档