有一个简单的代码来查询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
答案 0 :(得分:3)
如果只有一个拓扑,那么它只是@MattJacob already said in his comment。
$out->{topologies}->[0]->{id}
如果还有更多,您可以进行迭代。
my @ids;
foreach my $topology ( @{ $out->{topologies} } ) {
push @ids, $topology->{id};
}
这是一个包含自由圈的视觉解释。
首先,哈希引用只有单个键拓扑。
$out->{topologies};
在该键下,有一个数组引用。该数组引用中的元素是哈希引用,但只有一个。要获得第一个,请使用索引0
。
$out->{topologies}->[0];
现在,您已经获得了包含拓扑内部所有属性的哈希引用。您可以使用密钥 id 来获取转储右侧的字符串。
$out->{topologies}->[0]->{id};
另见perlreftut。
答案 1 :(得分:3)
要回答您的具体问题,您需要使用dereference operator(->
):
$out->{topologies}->[0]->{id}
从技术上讲,下标之间的箭头是可选的,因此上面的行可以改写为:
$out->{topologies}[0]{id}
但是,既然您首先要问这个问题,我建议您阅读perldsc,perlref和perlreftut,以便为Perl中的引用奠定坚实的基础。