遍历哈希数组
Iterating through an array of hashes
我编写了以下例程,遍历哈希值 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'
这是遍历数组的方法
for my $cur (@{$out->{data}})
{
...
}
您的 $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 - 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'
这是遍历数组的方法
for my $cur (@{$out->{data}})
{
...
}
您的 $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;
如果您不需要在循环中执行任何其他操作