2 votes

Déférence de hachage en Perl

J'ai une référence HASH $job qui dispose de ces données :

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

Je veux imprimer la valeur de hachage de la clé "response". J'ai essayé de faire ceci mais cela n'a pas fonctionné

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

Modifier

Je ne veux pas de formatage. Je veux savoir comment accéder à chaque élément de la valeur de la clé 'response'.

3voto

ikegami Points 133140

Je veux savoir comment accéder à chaque élément de la valeur de la clé 'response'.

Par définition, vous avez besoin d'une sorte de boucle. Une boucle foreach est typique, bien que vous puissiez également utiliser map .

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

ou

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

2voto

sputnick Points 31663

Essayez le code suivant, il s'agit d'un script réel et complet :

#!/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"; 
        }
    }
}

C'est la sortie :

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

Si vous voulez accéder à la clé "group_id" :

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

Si vous voulez seulement accéder au HASH "réponse" sans rien tester :

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

ou avec ce while boucle et each :

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

1voto

jmcneirney Points 1354
use Data::Dumper;

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

ou individuellement ...

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

0voto

OndraSej Points 202

Je ne suis pas tout à fait sûr de ce que vous essayez d'obtenir ; votre code imprimerait le contenu du hachage interne sans aucun formatage. Si vous voulez une sortie formatée, vous devez utiliser la fonction Data::Dumper module :

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'});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X