2010-09-16 29 views
3

我想打印的哈希值的数组的数组,所以我看着perldsc,并结束了与如何循环哈希数组的Perl数组?

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

,但它不工作。

有谁知道如何做到这一点?

+6

记住张贴的完整测试程序。可能还有一些你正在做的事情已经破裂了。此外“不起作用”并没有真正告诉我们任何事情。你期望得到什么,你得到了什么?向我们显示所有输出,错误消息,警告等。 – 2010-09-16 12:01:42

回答

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"; 
    } 
} 

UPDATE:对不起,它必须是阵列(未数组引用)

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',请使用打开它的某个编译指示。否则,人们会认为你的例子被破坏了(因为它是)。 – 2010-09-16 11:03:12

+0

回复:查思评论。如果你有Perl的pre 5.10版本,那么看看'Perl :: Say' CPAN模块。否则将'say'修改为'print'和后缀的换行符(即“print”一些文本\ n“;'而不是'说'一些文本';' – draegtun 2010-09-16 11:17:06

+0

@Chas。Owens:已经更新了。人们不会认为它现在已经坏了,因为它们没有运行在perl 5.12上:) – draegtun 2010-09-16 11:21:22

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