如何使用带有哈希引用的foreach?

时间:2011-03-09 17:02:10

标签: perl hash

我有这段代码

foreach my $key (keys %ad_grp) {

    # Do something
}

有效。

如果我没有%ad_grp,而是参考$ad_grp_ref,那么哈希会怎样?

4 个答案:

答案 0 :(得分:56)

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 }时,您无需仔细考虑要更改的内容)

答案 1 :(得分:8)

在Perl 5.14中(它现在在Perl 5.13中运行),我们只能use keys on the hash reference

use v5.13.7;

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

答案 2 :(得分:4)

正如其他人所说,你必须取消引用该引用。 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 :(得分:2)

因此,使用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及更高版本不需要任何编译指示来实现此功能。