2016-02-29 139 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