2010-09-16 57 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