2016-03-01 153 views
0

我已經寫了下面的例程,遍歷散列0 - 7並打印出每個中特定鍵的值。我需要在每個散列中獲取'b4'的值。通過散列數組迭代

我想取消(0..7),當有不同數量的哈希值時更智能。例如,有時僅存在2或有可能是160

my $out = decode_json $client->responseContent(); 

#print "\nOutput is :\n\n" . Dumper $out; 
for my $slice (0..7) { 
    my $out = $out->{data}[$slice]{b4}; 
    print " $out \n"; 
} 

的數據被構造爲這樣:

DB<1> x $out 
0 HASH(0x125fb5e0) 
    'data' => ARRAY(0x1260d760) 
     0 HASH(0x121765d0) 
      'b1' => '21' 
      'b2' => '22' 
      'b3' => '23' 
      'b4' => '24' 
      'b5' => '25' 
      'b6' => '26' 
      'b7' => '27' 
     1 HASH(0x125fb650) 
      'b1' => '21' 
      'b2' => '22' 
      'b3' => '23' 
      'b4' => '24' 
      'b5' => '25' 
      'b6' => '26' 
      'b7' => '27' 
     2 HASH(0x1236b960) 
      'b1' => '21' 
      'b2' => '22' 
      'b3' => '23' 
      'b4' => '24' 
      'b5' => '25' 
      'b6' => '26' 
      'b7' => '27' 
     3 HASH(0x12177030) 
      'b1' => '21' 
      'b2' => '22' 
      'b3' => '23' 
      'b4' => '24' 
      'b5' => '25' 
      'b6' => '26' 
      'b7' => '27' 
     4 HASH(0x1260da00) 
      'b1' => '21' 
      'b2' => '22' 
      'b3' => '23' 
      'b4' => '24' 
      'b5' => '25' 
      'b6' => '26' 
      'b7' => '27' 
+1

[perldsc(HTTP://的perldoc。 perl.org/perldsc.html)(Perl數據結構食譜)可能會有所幫助。它演示瞭如何創建和遍歷各種數據結構,如散列數組。 – ThisSuitIsBlackNot

回答

3

在你的$out是對單元素散列的引用,其具有其數組引用的值data元素

最好將參考提取到單獨的變量中,以便您可以更簡單地訪問內容。假設你寫

my $data = $out->{data}; 

此後,該陣列是@$data訪問,它包含的元素個數爲scalar @$data,而指數0 .. $#$data。您可以訪問陣列中的每個元素與$data->[0]$data->[1]

您的代碼將成爲

my $out = decode_json $client->responseContent; 
my $data = $out->{data}; 

for my $i (0 .. $#$data) { 
    my $item = $data->[$i]; 
    my $b4 = $item->{b4}; 
    print "$b4\n"; 
} 

不過需要注意的是,除非你需要用於其他目的數組索引,你可能會更好過遍歷數組元素本身而不是它的索引。此代碼會做同樣的事情

my $out = decode_json $client->responseContent; 
my $data = $out->{data}; 

for my $item (@$data) { 
    my $b4 = $item->{b4}; 
    print "$b4\n"; 
} 

甚至只是

print "$_->{b4}\n" for @$data; 

,如果你不需要你的循環中做別的

+0

令人驚歎的是,感謝您的解釋! – lollan

0

以下是如何遍歷陣列

for my $cur (@{$out->{data}}) 
{ 
    ... 
} 
+0

'$ out - > {data}'是列表引用,而不是散列引用。 – mob

+0

是的,我最初錯過了。答案固定。請注意標題不正確,我將更正。 –

+2

@mob:沒有這樣的事情作爲列表引用。 '$ out - > {data}'是一個數組引用 – Borodin