2015-11-18 51 views
0

我試圖提取我需要的值'system1 system2 system3 system4'。我曾經從下面的$json輸出中提取內容。我收到錯誤ARRAY(0x210e150)。請建議如何僅檢索這些值。如何在perl中提取json值

$VAR1 = { 
      'response' => { 
          'mydocs' => [ 
             { 
             'host' => 'system1' 
             }, 
             { 
             'host' => 'system2' 
             }, 
             { 
             'host' => 'system3' 
             }, 
             { 
             'host' => 'system4' 
             } 
             ], 
             } 

            }; 

use LWP::Simple;    
use JSON;  
use Data::Dumper;    


my $url = "https://localhost/content; 

my $json = from_json(get($url)); 

print Dumper($json); # received above output 

print "$json->{'response'}->{'docs'}"; 

for my $data (@$json) { 
    my $result = ref $data->{response} ? $data->{response}->{docs} : $data->{response}; 
    print "Result is $result\n"; 
} 
+2

'ARRAY(0x210e150)'不是錯誤。這是數據結構的字符串表示/地址。 – simbabque

+1

該代碼對您顯示的輸出沒有意義。 '$ json'中沒有數組ref,如果這就是你所顯示的'$ VAR1'。你也一直提到一個關鍵的'docs',但在你的數據中只有'mydocs'。如果輸出'ARRAY(0x210e150)'來自'print'$ json - > {'response'} - > {'docs'}'行,那麼它非常正確,假設有一個關鍵的'docs'而不是'mydocs'),因爲那裏麪包含一個帶有一堆hash ref的數組ref,如果你打印它,它會顯示地址,你可以用'Dumper'來像上面那樣查看其他內容。 – simbabque

回答

5

$json是哈希參考,不是數組引用,所以上循環@$json將不起作用。你需要做的是深入到哈希值的數組開始的地方,並遍歷是:

for my $host (@{ $json->{response}{mydocs} }){ 
    print "host: $host->{host}\n"; 
} 

...這:

print "$json->{'response'}->{'mydocs'}"; 

...是打印出來的內存地址mydocs數組引用。我上面做的是遍歷這個數組引用,每次提取它包含的每個哈希引用,然後處理它。