如何循环遍历 Perl 数组中的数组和哈希?

3

我想打印一个由哈希组成的数组数组,所以我查看了perldsc,最终得到以下代码:

for my $j (0 .. $#aoaoh) {
    for my $aref (@aoaoh) {
    print '"' . join('","', @$aref[$j]), "\"\n";
    }
}

但它不起作用。

有人知道如何做到这一点吗?


6
请记得发布完整的测试程序。可能还有其他问题导致程序无法正常工作。同时,“不起作用”并不能说明问题所在。请告诉我们你期望得到什么,实际得到了什么?展示所有的输出、错误消息、警告等信息。 - brian d foy
4个回答

8

只要你已经完成了前面的步骤,它就能正常工作。将一些测试数据添加到程序中,我们得到:

#!/usr/bin/perl

use strict;
use warnings;

my @aoaoh = (
    [
        { a => 1, b => 2 },
        { c => 3, d => 4 },
    ],
    [
        { a => 101, b => 102 },
        { c => 103, d => 104 },
    ],
);

for my $j (0 .. $#aoaoh) {
    for my $aref (@aoaoh) {
    print '"' . join('","', @$aref[$j]), "\"\n";
    }
}

运行该程序会得到以下结果:

$ ./aoaoh 
"HASH(0x9c45818)"
"HASH(0x9c70c48)"
"HASH(0x9c60418)"
"HASH(0x9c70c08)"

那么你已经成功地遍历了两个层级的数组,现在只剩下哈希引用需要解引用。可能是这样的:

#!/usr/bin/perl

use strict;
use warnings;

my @aoaoh = (
    [
        { a => 1, b => 2 },
        { c => 3, d => 4 },
    ],
    [
        { a => 101, b => 102 },
        { c => 103, d => 104 },
    ],
);

for my $j (0 .. $#aoaoh) {
    for my $aref (@aoaoh) {
        # print '"' . join('","', @$aref[$j]), "\"\n";
        for (keys %{$aref->[$j]}) {
            print "$_ -> $aref->[$j]{$_}\n";
        }
    }
}

这将会得到:

$ ./aoaoh 
a -> 1
b -> 2
a -> 101
b -> 102
c -> 3
d -> 4
c -> 103
d -> 104

个人而言,我会这样写,因为我认为处理元素比处理索引更容易。

#!/usr/bin/perl

use strict;
use warnings;

my @aoaoh = (
    [
        { a => 1, b => 2 },
        { c => 3, d => 4 },
    ],
    [
        { a => 101, b => 102 },
        { c => 103, d => 104 },
    ],
);

for my $aref (@aoaoh) {
    for my $href (@$aref) {
        for (keys %{$href}) {
            print "$_ -> $href->{$_}\n";
        }
    }
}

1
foreach my $aoh (@aoaoh) {

    foreach my $hashref ( @{$aoh} ) {

        foreach my $key ( keys %{$hashref} ) {

            print $key . " => " . $hashref->{$key}, "\n";
        }

        print "#" x 40, "\n";
    }
}

更新:抱歉,它必须是数组(而不是数组引用)


1

要循环遍历整个套件和全部内容

use 5.012;
use warnings;

my @array = (
    [
        { a => 1, b => 2 },
        { c => 3, d => 4 },
    ],
    [
        { a => 101, b => 102 },
        { c => 103, d => 104 },
    ],
);

for my $root (@array) {
    for my $each_array_of_hashes (@$root) {
        for my $k (keys %{ $each_array_of_hashes } ) {
            say $k, ' => ', $each_array_of_hashes->{$k};
        }
    }
}

这是你想要的吗?


1
如果你要使用 say,请使用其中一个打开它的编译指示 pragma。否则人们会认为你的示例是有问题的(因为确实是有问题的)。 - Chas. Owens
回复:查斯的评论。如果您使用的是5.10版本之前的Perl,则可以查看Perl::Say CPAN模块。否则,请将say更改为print并在后面加上换行符(即print“some text \ n”;而不是say“some text”;)。 - draegtun
@Chas. Owens:已经更新了。希望人们不会认为它现在坏了,因为他们没有在Perl 5.12上运行 :) - draegtun

1

请查看perlreftut,它会帮助你, 并查看下面的答案。

  #!/usr/bin/perl

    use strict;
    use warnings;

    my @aoaoh = (
        [
            { a => 1, b => 2 },
            { c => 3, d => 4 },
        ],
        [
            { a => 101, b => 102 },
            { c => 103, d => 104 },
        ],
    );
    for my $j (0 .. $#aoaoh) {
        for my $aref (@{$aoaoh[$j]}) {
            for my $test (keys %{$aref})
            {
               print"$test => ${$aref}{$test}\n";
            }
        }
    }

输出:

a => 1
b => 2
c => 3
d => 4
a => 101
b => 102
c => 103
d => 104

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接