如何将 foreach 与哈希引用一起使用?

Posted

技术标签:

【中文标题】如何将 foreach 与哈希引用一起使用?【英文标题】:How to use foreach with a hash reference? 【发布时间】:2011-07-12 02:02:34 【问题描述】:

我有这个代码

foreach my $key (keys %ad_grp) 

    # Do something

哪个有效。

如果我没有 %ad_grp 而是引用 $ad_grp_ref 对哈希的引用,那会是什么样子?

【问题讨论】:

What's the safest way to iterate through the keys of a Perl hash?的可能重复 【参考方案1】:
foreach my $key (keys %$ad_grp_ref) 
    ...

Perl::Critic和daxim推荐风格

foreach my $key (keys % $ad_grp_ref ) 
    ...

出于对可读性和维护性的考虑(这样当您需要使用% $ad_grp_obj[3]->get_ref() 而不是% $ad_grp_ref 时,您无需费力思考要更改的内容)

【讨论】:

如果你教的风格更好,你会得到我更多的支持:keys % $ad_grp_ref 这不是更好,而是更糟。另外,perlmonks.org/?node=References+quick+reference 会很有帮助 我完全同意 ysth,没有理由让表达式变得比它需要的更复杂。 keys %$ad_grp_ref 更具可读性,尤其是在被其他外接运算符包围时。 如您所见,Sandra,有不止一种方法可以做到这一点。【参考方案2】:

正如其他人所说,您必须取消引用该引用。 keys 函数要求其参数以 %:

开头

我的偏好:

foreach my $key (keys %$ad_grp_ref) 

根据Conway:

foreach my $key (keys % $ad_grp_ref ) 

猜猜你应该听谁的...

您可能想通读Perl Reference Documentation。

如果您发现自己在做很多关于哈希和列表哈希以及哈希列表的引用的事情,您可能想要开始考虑使用Object Oriented Perl。 Perl 文档中有a lot of nice little tutorials。

【讨论】:

【参考方案3】:

在 Perl 5.14 中(现在可以在 Perl 5.13 中使用),我们可以只使用 use keys on the hash reference

use v5.13.7;

foreach my $key (keys $ad_grp_ref) 
    ...

【讨论】:

您将需要 use 5.14.0 或类似的东西来确保您的脚本不会尝试在 Perl 版本上运行,该版本太旧而无法使用此语法(或者当然允许的任何 5.13.X )。 好点,我应该把它放在代码示例中。已修改。 Experimental keys on scalar is now forbidden。此功能已在 5.22 中删除。 (ish)【参考方案4】:

对于 Perl 5.20,新的答案是:

foreach my $key (keys $ad_grp_ref->%*) 

(它的优点是可以透明地处理更复杂的表达式:

foreach my $key (keys $ad_grp_obj[3]->get_ref()->%*) 

等等)

有关完整文档,请参阅 perlref。

注意:在 Perl 5.20 和 5.22 版本中,这种语法被认为是实验性的,所以你需要

use feature 'postderef';
no warnings 'experimental::postderef';

在任何使用它的文件的顶部。 Perl 5.24 及更高版本不需要此功能的任何编译指示。

【讨论】:

以上是关于如何将 foreach 与哈希引用一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 foreach 与二维对象数组一起使用?

如何将 foreach 与特殊的第一个元素一起使用?

如何在 R 中将“foreach”和“%dopar%”与“R6”类一起使用?

不能将 forEach 与 Filelist 一起使用

如何使 C++ 中的 for each 循环函数与自定义类一起使用

为啥将 %dopar% 与 foreach 一起使用导致 R 无法识别包?