2015-11-18 3 views
0

Я пытаюсь извлечь значения, которые мне нужны «system1 system2 system3 system4». Я использовал для извлечения содержимого из вывода $json, как показано ниже. Я получаю ошибку ARRAY(0x210e150). Пожалуйста, предложите, как получить только эти значения.Как извлечь значение json в perl

$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'), потому что в нем содержится массив ref с кучей хэш-ссылок внутри, и если вы' напечатаете', то он отобразит адрес. Вы можете 'Dumper', как вы делали это выше, чтобы увидеть что-то еще. – simbabque

ответ

5

$json хэш ссылки, а не ссылка на массив, так что цикл по @$json не будет работать. Что вам нужно сделать, это вникать вниз, где начинается массив хэшей, и перебираем, что:

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

... и это:

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

... печатает из адреса памяти ссылки на массив mydocs. То, что я делаю выше, - это цикл по этой ссылке массива, из которой извлекается каждая хеш-ссылка, содержащая по одному, а затем работать над этим.

Смежные вопросы