我在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};
答案 0 :(得分:2)
-1
作为下标要访问数组的最后一个元素(引用),您应该使用-1
作为下标:
print $data->{patchSets}[-1]{ref}; # DEF
数组索引从0开始。负下标检索它 从最后的价值。
$#
作为下标在这种情况下,由于嵌套引用而使得最后一个元素可以说不太清楚的另一种方法是使用$#
来获取最后一个索引:
print $data->{patchSets}[$#{$data->{patchSets}}]{ref}; # DEF again
你可以通过获取数组的大小并记住从中减去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'
}
]
};