通过散列数组迭代

问题描述:

我已经写了下面的例程,遍历散列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

在你的$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

以下是如何遍历阵列

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

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

+0

是的,我最初错过了。答案固定。请注意标题不正确,我将更正。 –

+2

@mob:没有这样的事情作为列表引用。 '$ out - > {data}'是一个数组引用 – Borodin