2012-05-25 6 views
2

У меня есть ссылка HASH $job, который имеет эти данные:Hash разыменовать в Perl

{ 
    "opstat" : "ok", 
    "response": { 
       "group_id":23015, 
       "order_id":"139370", 
       "job_count":"10", 
       "credits_used":"100.45", 
       "currency":"USD" 
       } 
} 

Я хочу, чтобы напечатать значение хэш-ключа «ответ». Я попытался сделать это, но не работает

print %{$job->{'response'}}

Редактировать

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

ответ

3
Я хочу знать, как получить доступ к каждому элементу в значении ключа «ответ».

По определению вам нужен какой-то цикл. Цикл foreach типичен, хотя вы также можете использовать map.

for my $key (keys %{$job->{response}}) { 
    my $val = $job->{response}{$key}; 
    print("$key: $val\n"); # Or whatever 
} 

или

my $response = $job->{response}; 
for my $key (keys %$response) { 
    my $val = $response->{$key}; 
    print("$key: $val\n"); # Or whatever 
} 
1
use Data::Dumper; 

print Dumper($job->{response}); 

или индивидуально ...

print $job->{response}{group_id}; 
0

Я не совсем уверен, что вы пытаетесь достичь; ваш код будет печатать содержимое внутреннего хэша без какого-либо форматирования. Если вы хотите форматированный вывод, вы должны были бы использовать Data::Dumper модуль:

use Data::Dumper; 
my $job = { 
    "opstat" => "ok", 
    "response" => { 
    "group_id":23015, 
    "order_id":"139370", 
    "job_count":"10", 
    "credits_used":"100.45", 
    "currency":"USD" 
    } 
}; 
print Dumper($job->{'response'}); 
2

Попробуйте следующий код, это реальный & полный сценарий:

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $job = { 
    'opstat' => 'ok', 
    'response' => { 
     'currency' => 'USD', 
     'group_id' => ':23015', 
     'job_count' => '10', 
     'order_id' => '139370', 
     'credits_used' => '100.45' 
    } 
}; 

foreach my $key (keys %{$job}) { 
    print "key=$key|value=$job->{$key}\n"; 

    # Testing if "$job->{$key}" is a HASH ref 
    # ...if yes, we iterate inside the HASH 
    # through the next level. 
    if (ref($job->{$key}) eq "HASH") { 
     foreach my $key2 (keys %{$job->{$key}}) { 
      print "\tkey=$key2|value=$job->{$key}->{$key2}\n"; 
     } 
    } 
} 

Это выход:

key=opstat|value=ok 
key=response|value=HASH(0x1638998) 
     key=currency|value=USD 
     key=group_id|value=:23015 
     key=order_id|value=139370 
     key=job_count|value=10 
     key=credits_used|value=100.45 

Если вы хотите присоединяться s "group_id" ключ:

print $job->{response}->{group_id}; 

Если вы хотите получить доступ к "ответ" HASH без тестирования ничего:

foreach my $key (keys %{$job->{response}}) { 
    print "key=$key|value=$job->{response}->{$key}\n"; 
} 

или с этим while петли и each:

while (my ($key,$value) = each %{$job->{response}}){ 
    print "key=$key|value=$value\n"; 
}