【问题标题】:In perl, print the last item value from JSON data在 perl 中,打印 JSON 数据中的最后一项值
【发布时间】:2015-11-20 23:23:50
【问题描述】:

我在JSON->new 变量中有如下示例所示的数据,我只需要打印最后一个'ref',即DEF,大小可能会有所不同,有没有比循环和打印最后一个更简单的方法物品?谢谢。

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

编辑:好吧,代码 sn-p 如下所示打印第一个效果很好的元素,但我需要打印最后一个元素:

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};

【问题讨论】:

  • 你已经转储了一个 Perl 哈希。 Perl 代码是什么样的?无论如何,$array[-1] 会给你一个数组的最后一个元素。如果您编辑帖子以包含您的实际代码,我可以为您提供完整的答案。
  • 它有效,请将其发布为答案。多谢。 -1 如何选择最后一个元素?
  • 查看我的回答,了解为什么 -1 有效。

标签: json perl


【解决方案1】:

使用-1作为下标

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

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

来自perldoc perldata

数组索引从 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'
                           }
                         ]
        };

【讨论】:

  • 投反对票?哎呀...艰难的人群。匿名投反对票:发表评论解释为什么您对这个答案投反对票会很有帮助。
  • 为了我的钱,你写了一个懒惰的答案,只回应一个糟糕问题的主题行。 Stack Overflow 不是一个论坛,而是一个知识库。因此,虽然从愿意接受并支持您的回复的人那里获得 25 点经验值可能很诱人,但这对网站不利。不,你的反对票都不是来自我
  • 我们可能在这里进入元领域,但这个答案:a)回答了所提出的问题,b)提供了答案为何有效的背景,c)甚至提供了可行的替代解决方案.如果你说这个问题一开始就不应该问,那几乎不是回答它的人的错!
  • 如果你认为这些品质是一个很好的答案,那么你就无能为力了
  • 根据 Stack Overflow,这些东西构成了 good answer,而不仅仅是我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 2013-06-24
  • 1970-01-01
相关资源
最近更新 更多