2013-07-31 3 views
1

Я пытаюсь получить доступ к данным, возвращаемым из api, я просто не могу получить правильные значения из массива, я знаю, что API возвращает данные, поскольку Dumper может распечатать его на экране no проблема.Печать информации из perl массивов/хешей

При попытке распечатать всю информацию о массиве, чтобы я точно знал, что распечатать, я просто получаю хэш. Извините, если это запутанно, все еще учатся.

Используя следующий код, который я получаю ниже вывод,

foreach my $hash (@{$res->data}) { 
    foreach my $key (keys %{$hash}) { 
    print $key, " -> ", $hash->{$key}, "\n"; 
    } 
} 

Выход

stat -> HASH(0xf6d7a0) 
gen_info -> HASH(0xb66990) 

Кто-нибудь из вас знает, как я могу изменить выше, чтобы пройти в хэши?

Нижняя строка того, что я пытаюсь сделать, это распечатать определенное значение для массива.

См. Мой самосвал массива.

print Dumper(\$res->data); 

http://pastebin.com/raw.php?i=1deJZX2f

Данные я пытаюсь распечатать это справ поле.

Я думал, что это будет что-то вроде

print $res->data->[1]->{guid} 

Но это не похоже на работу, я уверен, что я просто не хватает что-то здесь и думать о нем больше, чем я должен, если кто-то мог мне точку в направлении записи или напишите мне правильный отпечаток и объяснить, что я делаю неправильно, что было бы здорово

Спасибо

+0

Диафрагменное ield, который вы ищете, это '$ res-> data -> {gen_info} {guid}'. – hobbs

ответ

1

У вас есть массив хешей хешей. Это показано на свалке, как

# first hash with key being 'stat', 
#  Second hash as keys (traffic, mail_resps...) followed by values (=> 0) 
'stat' => { 
      'traffic' => '0', . 
      'mail_resps' => '0', 

поэтому значение ключей в первой хэш является хэш или хеш-хешей.

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

foreach my $hash (@{$res->data}) { # For each item in the array/list 
    foreach my $key (keys %{$hash}) { # Get the keys for the first hash (stat,gen_info) 
    foreach my $secondKey (keys %{$hash->{$key}}) # Get the keys for the second hash 
    { 
     print $key, " -> ", $secondKey, " -> ",${$hash->{$key}}{$secondKey}, "\n"; 
    } 
    } 
} 

Если вы просто заинтересованы в GUID, то вы сможете получить доступ как:

$res->data->[1]->{gen_info}{guid} 

где gen_info является ключом для первого хэша и GUID является ключом для второго хэша

Вы можете проверить, если ключи существует в первой и второй хэш перед доступом с использованием выходов

$n = 1 # Index of the array you want to get the information 
if ((exists $res->data->[$n]->{gen_info}) && # Check for the keys to exists in 
    (exists $res->data->[$n]->{gen_info}{guid})) # in each hash 
{ 
    # do what you need to 
} 
else 
{ 
    print "ERROR: either gen_info or guid does not exist\n"; 
} 
+0

Спасибо, Гленн. Это было именно то, что я искал, просто нужно было изменить индекс массива на 0, и он сработал! У меня много чтения, чтобы потом я увидел. Еще раз спасибо – ccsteale

+1

Вы можете опустить '->' после '[$ n]'. – friedo

+0

Благодарим за то, что после [$ n] можно исключить ->. – Glenn

2

Если есть хэш в хэш, вы могли бы попробовать это

foreach my $hash (@{$res->data}) { 

    foreach my $key (keys %{$hash}) { 

     my $innerhash = $hash->{$key}; 

     print $key . " -> " . $hash . "\n"; 

     foreach my $innerkey (keys %{$innerhash}) { 

      print $key. " -> " . $innerhash->{$innerkey}. "\n"; 

     } 
    } 
} 
+0

Спасибо за это, это то, что мне нужно.То, что я ищу, - это выяснить, что мне нужно, чтобы положить в мой оператор печати, как внизу моего сообщения. Чтобы напечатать только поле guid из этого $ res-> data -> ... знаете ли вы, что мне нужно будет заменить ... с массивом, это не моя самая сильная точка. – ccsteale

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