2012-04-10 5 views
2

J'essaie de stocker la réponse d'un appel SOAP Perl (v5.12.4) (requête SQL) comme un hachage pour un traitement ultérieur tout en conservant la structure des données. Les colonnes varieront donc j'aimerais pouvoir construire les clés de colonne dynamiquement. Voici un exemple de réponse:Stockage de la réponse SOAP comme hash

$VAR1 = { 
     'row' => [ 
       #0 
       { 
       'column1' => '', 
       'column2' => 'f', 
       'column3' => '0', 
       'column4' => '', 
       'column5' => 'f', 
       'column6' => '0', 
       'column7' => 'f', 
       }, 
      ] 
     }; 

Je suis intéressé par les noms et les valeurs des colonnes. Je l'ai fait quelques tentatives comiques() à la manipulation de ce, comme:

unless ($res->fault) { 
    $Data::Dumper::Indent = 3; 
    my (%reply) = $res->paramsall(); 
    foreach my $keys (keys %reply) { 
    print "$keys\n"; 
    } 
} 

Cela devient une « référence trouvée où la liste même taille attendue à la ligne de script.pl ... ». Tout point dans la bonne direction est très apprécié.

Merci

Répondre

3

ceci:

$res->paramsall() 

revient presque certainy un hashref.

Donc ce que vous faites est d'assigner le hashref à la 1ère touche de% reply.

my %reply = %{ $res->paramsall() }; 

Va probablement fonctionner.

Vous devriez jeter un oeil à perlreftut pour quelques méthodes pour travailler avec des structures de reférence. Les dièses de déréférencement avec mon hash% =% {} font une copie du hachage référencé


Vous pouvez travailler directement avec hashrefs comme ceci:

my $reply = $res->paramsall(); 

foreach my $key1 (keys %$reply) { 
    foreach my $key2 (keys %{ $reply->{$key1} }) { 
    print " $key2: " . $reply->{$key1}{$key2} . "\n"; 
    } 
} 

Dans l'exemple 1er code dans votre réponse, ceci:

$reply{$key2}->{$key2} 

devrait lire:

$reply{$key1}{$key2} 

puisque tout est déjà déréférencé.

+0

Salut John, Ça a bien fonctionné, merci! J'ai quelques problèmes en essayant d'accéder à la clé/valeur dans le hachage. J'utilise: foreach mon $ key1 (clés% réponse) { \t foreach mon $ key2 (clés% {$ réponse {$ key1}}) { impriment "$ key2:". $ reply {$ key2} -> {$ key2}. "\ n"; \t}} Mais je reçois « Pas une référence HASH à la ligne de script.pl .... » Tous les conseils sur l'analyse syntaxique du hachage? Merci! –

+0

Eh bien, j'ai trouvé un moyen d'accéder à l'info mais je ne pense pas que ce soit la solution la plus élégante .... mais cela fonctionne: my $ count = 0; \t jusqu'à ($ réponse {'row'} [$ count] eq undef) { mon% newHash =% {$ réponse {'row'} [$ count]}; while (mon ($ key, $ value) = chaque% newHash) { \t \t print "$ clé = $ valeur \ n"; } $ nombre ++; Si quelqu'un a une suggestion pour affiner ma solution, je suis tout ouïe. Merci! –

+0

a répondu dans la réponse originale .. – John