在perl中,从JSON数据中打印最后一个项值

时间:2015-11-20 23:23:51

标签: json perl

我在JSON->new变量中有以下示例所示的数据,我只需打印最后一个'ref',即DEF,大小可能会有所不同,是否有一种简单的方法而不是循环并打印最后一项?谢谢。

$VAR1 = {
      'patchSets' => [
                  {
                    'ref' => 'ABC',
                    'id' => '123'
                  },
                  {
                    'ref' => 'PQR',
                    'id' => '456'
                  },
                  {
                    'ref' => 'DEF',
                    'id' => '789'
                  }
                ]
    };
编辑:嗯,代码片段看起来如下所示打印第一个效果很好的元素,但我需要打印最后一个元素:

my $json = JSON->new;
my $json_text = `ssh -p $port $host gerrit query --format=JSON project:path/to/project --patch-sets $commitId`;

#truncate {"type":"stats","rowCount":1,"runTimeMilliseconds":6}
$json_text = ( split /\n/, $json_text )[0];
my $data = $json->decode($json_text);
#print Dumper $data;
print $data->{patchSets}[0]{ref};

1 个答案:

答案 0 :(得分:2)

使用-1作为下标

要访问数组的最后一个元素(引用),您应该使用-1作为下标:

print $data->{patchSets}[-1]{ref};  # DEF

来自perldoc perldata

  

数组索引从0开始。负下标检索它   从最后的价值。

使用$#作为下标

在这种情况下,由于嵌套引用而使得最后一个元素可以说不太清楚的另一种方法是使用$#来获取最后一个索引:

print $data->{patchSets}[$#{$data->{patchSets}}]{ref};  # DEF again

使用数组大小​​减1作为下标

你可以通过获取数组的大小并记住从中减去1来实现与$#相同的功能,但同样,不是非常易读且难以理解的语法:

print $data->{patchSets}[scalar(@{$data->{patchSets}}) - 1]{ref};  # yep... DEF

使用pop()

最后,这是一个非常易读的替代品,附带警告。您可以pop获取最后一个数组元素,但实际上会修改数组,这可能并不总是您想要的。

my $last = pop(@{$data->{patchSets}});
print $last->{ref};  # still DEF

这是$data完成后的样子:

$VAR1 = {
          'patchSets' => [
                           {
                             'ref' => 'ABC',
                             'id' => '123'
                           },
                           {
                             'ref' => 'PQR',
                             'id' => '456'
                           }
                         ]
        };