2016-08-03 20 views
0

Ich habe ein seltsames Problem, das ich nicht umgehen kann. Kannst du bitte sehen, was ich falsch mache? Ich versuche, XML in Perl mit XML :: LibXML zu erstellen. Alles funktioniert gut, bis ich anfange, Subroutine zu bauen und Argumente zu übergeben.Wie Parameter in Perl übergeben werden, ohne dass Daten verändert werden

Zuerst Der Code, der

my $root = $doc->createElement("XML_FILE"); 
my @sortedOuterTags = qw (JMS_VERSION 
         FILE_NAME 
         SUBMIT_BY 
         SUBMIT_DATE 
        ); 

# Use hash slice to access the list in hash elements 
# Remember has elements are accessed randomly, hence hash slice-ing 

my %outHashTags; 
@outHashTags { @sortedOuterTags } = ('data1', 
           'data2', 
           'data3', 
           'data3'); 

for my $name (@sortedOuterTags) { 
    my $outTag = $doc->createElement($name); 
    my $outValue = $outHashTags{$name}; 
    $outTag->appendTextNode($outValue); 
    $root->appendChild($outTag); 
} 

arbeitet Baut Ausgabe:

<JMS_VERSION>data1</JMS_VERSION> 

<FILE_NAME>data2</FILE_NAME> 

<SUBMIT_BY>data3</SUBMIT_BY> 

<SUBMIT_DATE>data4</SUBMIT_DATE> 

Jetzt ist der Fehler:

Sobald ich unten I for-Schleife zu einer Unterroutine, wie Show ausgliedern Fehler bekommen. Ich überlasse 3 Parameter. 1) nicht Array-Werte von storedReportTag 2) nicht% reportHashTag Daten 3) $ Bericht Element erhalten ist leer

-Code erhalten:

buildXMLElements(\@sortedReportTag, %reportHashTags, $report); 

sub buildXMLElements() { 
    my(@elementTags, %hashTags, $parentElement) = @_; 

    for my $name (@elementTags) { 
     my $reportTag = $doc->createElement($name); 
     my $reportValue = $hashTags{$name}; 
     $reportTag->appendTextNode($reportValue); 
     $parentElement->appendChild($reportTag); 
    } 
} 

Ich möchte setzen in Unter wie ich habe mehrere Tags, um den Code wiederzuverwenden. Ich habe versucht, Parameter übergeben sowohl direkt als auch als Referenz .......

Danke

Update:

Nach der Bearbeitung meiner Sub es sieht nun wie folgt aus:

buildXMLElements(\@sortedReportTag, \%reportHashTags, $report); 

sub buildXMLElements() { 
    my($elementTags, $hashTags, $parentElement) = @_; 
    for my $name (@$elementTags) { 
     my $reportTag = $doc->createElement($name); 
     my $reportValue = $hashTags->[$name]; 
     $reportTag->appendTextNode($reportValue); 
     $parentElement->appendChild($reportTag); 
    } 
} 

es der Linie stirbt an:

my $reportValue = $hashTags->[$name]; 

Schluss Update:

Jims Hilfe

Mit korrigierte ich den Code: Hier endgültige Version, die

buildXMLElements(\@sortedReportTag, \%reportHashTags, $report); 

sub buildXMLElements() { 
    my($elementTags, $hashTags, $parentElement) = @_; 
     for my $name (@$elementTags) { 
     my $reportTag = $doc->createElement($name); 
     my $reportValue = $hashTags->{$name}; 
     $reportTag->appendTextNode($reportValue); 
     $parentElement->appendChild($reportTag); 
    } 
} 
+1

http://stackoverflow.com/questions/29354417 – mob

+1

http://stackoverflow.com/questions/1161043 – mob

Antwort

3
buildXMLElements(\@sortedReportTag, %reportHashTags, $report); 
... 
sub buildXMLElements() { 
    my(@elementTags, %hashTags, $parentElement) = @_; 

Sie arbeitet, kann das nicht tun. Der gesamte Inhalt von @_ wird @elementTags zugewiesen. Um Arrays oder Hashes an eine Subroutine zu übergeben, müssen Sie eine Referenz übergeben. Statt

buildXMLElements(\@sortedReportTag, \%reportHashTags, $report); 
... 
sub buildXMLElements() { 
    my($elementTags, $hashTags, $parentElement) = @_; 

nun versuchen, in der Subroutine $elementTags ist eine Array-Referenz und $hashTags ist eine Hash-Referenz. Um auf ein Element von elementTags Bezug zu nehmen, verwenden Sie $elementTags->[$i] oder beziehen Sie sich auf das gesamte Array do @$elementTags. Ebenso für reportHashTags Schlüsselnachschlagen $hashTags->[$key] verwenden, oder für den gesamten Hashgebrauch %$hashTags.

+0

Wow! Danke. Just probiert und es funktioniert – sannag

+0

Gut, wenn ich den Hash referenzieren wirft es mir einen Fehler. Hier ist der Code dafür.Ich bin neu in Perl Sub buildXMLElements() { meine ($ elementTags, $ hashTags, $ parentElement) = @ _; für meinen $ name (@ $ elementTags) { mein $ reportTag = $ doc-> createElement ($ name); mein $ reportValue = $ hashTags -> [$ name]; $ reportTag-> appendTextNode ($ reportValue); $ parentElement-> appendChild ($ reportTag); } } es stirbt an der Zeile mein $ reportValue = $ hashTags -> [$ name]; :( – sannag

+0

Schreiben Sie keinen Code in einen Kommentar. Bearbeiten Sie entweder Ihren ursprünglichen Post oder stellen Sie eine neue Frage mit dem aktualisierten Code. Das heißt, der Code '$ reportValue = $ hashTags -> [$ name];' ist ungültig, weil Sie Verwendete Klammern '[]' anstelle von Klammern '{}' für einen Hash. –