我想打印一个由哈希组成的数组数组,所以我查看了perldsc,最终得到以下代码:
for my $j (0 .. $#aoaoh) {
for my $aref (@aoaoh) {
print '"' . join('","', @$aref[$j]), "\"\n";
}
}
但它不起作用。
有人知道如何做到这一点吗?
我想打印一个由哈希组成的数组数组,所以我查看了perldsc,最终得到以下代码:
for my $j (0 .. $#aoaoh) {
for my $aref (@aoaoh) {
print '"' . join('","', @$aref[$j]), "\"\n";
}
}
但它不起作用。
有人知道如何做到这一点吗?
只要你已经完成了前面的步骤,它就能正常工作。将一些测试数据添加到程序中,我们得到:
#!/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";
}
}
}
foreach my $aoh (@aoaoh) {
foreach my $hashref ( @{$aoh} ) {
foreach my $key ( keys %{$hashref} ) {
print $key . " => " . $hashref->{$key}, "\n";
}
print "#" x 40, "\n";
}
}
更新:抱歉,它必须是数组(而不是数组引用)
要循环遍历整个套件和全部内容:
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};
}
}
}
这是你想要的吗?
say
,请使用其中一个打开它的编译指示 pragma。否则人们会认为你的示例是有问题的(因为确实是有问题的)。 - Chas. OwensPerl::Say
CPAN模块。否则,请将say
更改为print
并在后面加上换行符(即print“some text \ n”;
而不是say“some text”;
)。 - draegtun请查看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