2016-02-29 403 views
0

我正在使用Perl进行一些API查询,并使用Data :: Dumper打印内容并希望将几个键作为变量分配。从嵌套散列/数组数据结构获取值

$client->request("GET", "interfaces/detail", $opts); 
    my $out = decode_json $client->responseContent(); 
    print Dumper $out; 

但是,我无法打印特定键的(b4)输出或将其定义为变量。

print $out{'b4'}; 

我认为,这是由于HASH/ARRAY/HASH/HASH /密钥=> JSON格式值的嵌套的数据结构。

DB<1> x $out 
0 HASH(0x493f290) 
    'data' => ARRAY(0x494e2e0) 
     0 HASH(0x4475160) 
     'a1' => '11' 
     'a2' => '12' 
     'a3' => '13' 
     'a4' => HASH(0x494e560) 
      'b1' => '21' 
      'b2' => 22 
      'b3' => '23' 
      'b4' => '24' 
      'b5' => '25' 
      'b6' => '26' 
      'b7' => '27' 
     'a5' => '14' 

如何从引用的布局中获取值“24”?

+2

'$ out - > {data} [0] {a4} {b4}' – ikegami

回答

2

$out不是散列,它是散列引用。如果您不确定Perl中的引用,请阅读Perl Reference Tutorial。参考文献取消->。而不是$out{key}它是$out->{key}

在你的具体情况下,你有一个散列的散列引用到另一个散列的散列。处理这些在Perl Data Structures Cookbook包括。由于b4有几层,因此您需要指定每个层。 $out->{data}[0]{a4}{b4}


$out{key}正在访问散列%out。印记(即$,@%)根据变量的使用方式而变化,但$out{key}仍然是%out

因为$out{key}访问一个不同的变量,你应该得到一个错误,如Global symbol "%out" requires explicit package name。不幸的是,Perl默认不会这样做,你必须打开use strict。这应该是您程序顶部的第一件事情之一。 You should really, really, really use strict and warnings。它会捕获像这样的许多令人沮丧的错误。

+0

Schwern,这非常有帮助,并且可以解答我的问题。谢谢!如果我可能再问一个问题,如果我想多次遍历散列并从多个'A4'散列获得值'B4',那我该怎么做?下面的工作是通过静态定义[0..8]的范围,但我希望它遍历每个散列并以编程方式获取'B4'输出。 \t为我的$切片(0..8){ \t \t my $ out = $ out - > {data} [$ slice] {wwpn}; \t \t print“$ out \ n”; \t} – lollan

+0

@lollan最好通过询问另一个Stack Overflow问题来处理。 – Schwern

+0

再次感谢! http://stackoverflow.com/questions/35734341/iterating-through-a-hash-of-hashes – lollan