2012-04-10 8 views
2

Ich versuche, die Antwort von einem Perl (v5.12.4) SOAP-Aufruf (SQL-Abfrage) als Hash für die weitere Verarbeitung zu speichern, während die Struktur der Daten beibehalten wird. Die Spalten variieren, daher möchte ich die Spaltenschlüssel dynamisch erstellen können. Hier ist ein Beispiel für die Antwort:Speichern der SOAP-Antwort als Hash

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

Ich interessiere mich für die Spaltennamen und Werte.

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

Dies wird eine „Referenz gefunden, wo auch große Liste an script.pl Linie erwartet ...“: Ich habe im Umgang mit dieser, wie einige (komisch) Versuchen gemacht. Jeder Punkt in der richtigen Richtung wird hier sehr geschätzt.

Dank

Antwort

3

Dieses:

$res->paramsall() 

gibt fast certainy eine hashref.

Also, was Sie tun, ist die Zuordnung der Hashref die erste Taste von% Antwort.

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

Wird wahrscheinlich funktionieren.

Sie sollten einen Blick auf perlreftut für einige Methoden mit Reference-Strukturen arbeiten.

Dereferenzierte Hashes mit meinem% hash =% {} erstellt eine Kopie des referenzierten Hashs.
Sie können mit hashrefs wie diese direkt arbeiten:

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

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

Im ersten Codebeispiel in Ihrer Antwort, dies:

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

sollte lauten:

$reply{$key1}{$key2} 

da alles schon dereferenziert.

+0

Hallo John, Das hat super funktioniert, danke! Ich habe einige Probleme beim Zugriff auf die Schlüssel/Werte im Hash. Ich benutze: foreach meine $ key1 (Schlüssel% Antwort) { \t foreach meine $ key2 (Schlüssel% {$ Antwort {$ key1}}) { print "$ key2:". $ Antwort {$ Schlüssel2} -> {$ Schlüssel2}. "\ n"; \t} } Aber ich bin immer "Not a Hashreferenz auf script.pl Linie ...." Jede Beratung über die Hash-Parsing? Danke! –

+0

Nun, ich fand einen Weg, um zu den Informationen zu gelangen, aber ich denke nicht, dass es die eleganteste Lösung ist .... aber es funktioniert: my $ count = 0; \t bis ($ reply {'row'} [$ count] eq undef) { mein% newHash =% {$ reply {'row'} [$ count]}; while (mein ($ key, $ value) = jedes% newHash) { \t \t print "$ key = $ value \ n"; } $ count ++; Wenn jemand einen Vorschlag hat, meine Lösung zu verfeinern, bin ich ganz Ohr. Danke! –

+0

antwortete in Originalantwort .. – John