Perl的。在哈希里面的数组中哈希。如何获取内部哈希的值?

时间:2016-01-12 16:20:35

标签: perl hash nested

有一个简单的代码来查询storm api

#!/usr/bin/env perl
use strict;
use warnings;
use HTTP::Request;
use LWP::UserAgent;
use LWP::Simple;
use JSON::XS;
use Try::Tiny;
use Data::Dumper;

my $ua = LWP::UserAgent->new; 
my $status = $ua->get("http://lab7.local:8888/api/v1/topology/summary");
my $sts = $status->decoded_content;
my $coder = JSON::XS->new->ascii->pretty->allow_nonref;
my $out = try {my $output = $coder->decode($sts)} catch {undef};
print Dumper(\%$out);

输出

$VAR1 = {
      'topologies' => [
                        {
                          'encodedId' => 'subscriptions_lab_product-8-1452610838',
                          'workersTotal' => 1,
                          'status' => 'ACTIVE',
                          'uptime' => '35m 54s',
                          'name' => 'subscriptions_lab_product',
                          'id' => 'subscriptions_lab_product-8-1452610838',
                          'tasksTotal' => 342,
                          'executorsTotal' => 342
                        }
                      ]
    };

我怎样才能得到例如' id'内部哈希的值?
操作系统:RHEL6.6
Perl:5.10.1

2 个答案:

答案 0 :(得分:3)

如果只有一个拓扑,那么它只是@MattJacob already said in his comment

$out->{topologies}->[0]->{id}

如果还有更多,您可以进行迭代。

my @ids;
foreach my $topology ( @{ $out->{topologies} } ) {
  push @ids, $topology->{id};
}

这是一个包含自由圈的视觉解释。

enter image description here

首先,哈希引用只有单个键拓扑

$out->{topologies};

在该键下,有一个数组引用。该数组引用中的元素是哈希引用,但只有一个。要获得第一个,请使用索引0

$out->{topologies}->[0];

现在,您已经获得了包含拓扑内部所有属性的哈希引用。您可以使用密钥 id 来获取转储右侧的字符串。

$out->{topologies}->[0]->{id};

另见perlreftut

答案 1 :(得分:3)

要回答您的具体问题,您需要使用dereference operator->):

$out->{topologies}->[0]->{id}

从技术上讲,下标之间的箭头是可选的,因此上面的行可以改写为:

$out->{topologies}[0]{id}

但是,既然您首先要问这个问题,我建议您阅读perldscperlrefperlreftut,以便为Perl中的引用奠定坚实的基础。