循环使用JSON数据并使用Perl打印出一个字段(非HASH参考)

cod*_*ugh 3 perl hash foreach json

我需要遍历几个jsons并打印出每个的索引1 ...

我从包含我的JSON数据的生成字符串开始.然后我解码字符串并将其转储以显示我正在使用的内容:

my $decoded = decode_json $string
print Dumper $string
Run Code Online (Sandbox Code Playgroud)

这导致以下输出:

$VAR1 = [
      {
        'hdr' => [
                   1,
                   'acknowledged',
                   '',
                   '/home/clanier/dev/test/sds-test/data/JPLIDR2015169.64575',
                   '2015/271-19:10:39.0101355',
                   '2015/271-19:10:39.2599252',
                   ''
                 ]
      },
      {
        'hdr' => [
                   2,
                   'acknowledged',
                   '',
                   '/home/clanier/dev/test/sds-test/data/JPLIDR2015169.64575',
                   '2015/271-19:10:39.3928414',
                   '2015/271-19:10:39.6397269',
                   ''
                 ]
      },
      {
        'hdr' => [
                   3,
                   'acknowledged',
                   '',
                   '/home/clanier/dev/test/sds-test/data/JPLIDR2015169.64575',
                   '2015/271-19:10:39.7726375',
                   '2015/271-19:10:40.0162758',
                   ''
                 ]
      }
    ];
Run Code Online (Sandbox Code Playgroud)

现在我尝试遍历这个并打印每个确认的单词:

foreach my $hdr ( $decoded->{hdr} ) {
  print $hdr->[1];
}
Run Code Online (Sandbox Code Playgroud)

我寻求这个解决方案的帮助,但由于"非HASH参考"错误,我看起来甚至无法获得原始海报.我以前能够打印一个特定的,但我需要循环并打印所有这些.这是代码:print $$decoded[0]->{'hdr'}->[1];

cho*_*oba 12

$decoded是一个数组引用,而不是哈希引用.你不能将它取消引用为哈希:->{.

您可以将其取消引用为数组:

for my $hdr (@$decoded) {
    print $hdr->{hdr}[1];
}
Run Code Online (Sandbox Code Playgroud)

有关 Perl中引用的更多信息,请参阅perlreftut.