2016-08-03 2 views
0

J'ai un problème curieux que je ne peux pas contourner. Pouvez-vous s'il vous plaît voir ce que je fais mal. J'essaye de construire un XML en Perl en utilisant XML :: LibXML. Tout fonctionne bien jusqu'à ce que je commence à construire des sous-routines et à passer des arguments.Comment passer des paramètres en Perl sans modifier les données

d'abord le code qui fonctionne

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

Builds sortie:

<JMS_VERSION>data1</JMS_VERSION> 

<FILE_NAME>data2</FILE_NAME> 

<SUBMIT_BY>data3</SUBMIT_BY> 

<SUBMIT_DATE>data4</SUBMIT_DATE> 

Maintenant l'erreur:

Dès que je spin off pour la boucle à une sous routine comme indiqué ci-dessous I obtenir des erreurs. Je passe 3 paramenters. 1) ne peut pas obtenir des valeurs de tableau de storedReportTag 2) ne peut pas obtenir% des données reportHashTag 3) élément de rapport de $ est vide

code:

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

Je veux mettre en sous que je avoir plusieurs balises à construire pour réutiliser le code. J'ai essayé de passer des paramètres à la fois directement et comme référence .......

Merci

Mise à jour:

Après avoir modifié mon Sub il ressemble maintenant à ceci:

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

il meurt à la ligne:

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

mise à jour finale:

Avec l'aide de Jim I corrigé le code: Voici la version finale qui fonctionne

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

Répondre

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

Vous ne pouvez pas faire cela. Le contenu entier de @_ sera affecté à @elementTags. Pour transmettre des tableaux ou des hachages à un sous-programme, vous devez transmettre une référence. Essayez plutôt

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

Maintenant, dans le sous-programme $elementTags est une référence de tableau, et $hashTags est une référence de hachage. Pour faire référence à un élément de elementTags, utilisez $elementTags->[$i] ou pour faire référence à l'ensemble du tableau, faites @$elementTags. De même, pour la recherche de clé reportHashTags, utilisez $hashTags->[$key] ou pour l'ensemble de la table de hachage %$hashTags.

+0

Wow! Je vous remercie. Juste essayé et cela fonctionne – sannag

+0

Eh bien, quand je référence le hachage, il me jette une erreur. Voici le code pour cela.Je suis nouveau à perl sub buildXMLElements() { mon ($ elementTags, $ hashTags, $ parentElement) = @_; pour mon $ nom (@ $ elementTags) { my $ reportTag = $ doc-> createElement ($ name); my $ reportValue = $ hashTags -> [$ name]; $ reportTag-> appendTextNode ($ reportValue); $ parentElement-> appendChild ($ reportTag); } } il meurt à la ligne my $ reportValue = $ hashTags -> [$ name]; :( – sannag

+0

Ne mettez pas de code dans un commentaire, soit éditez votre message original ou posez une nouvelle question avec le code mis à jour, cela dit, le code '$ reportValue = $ hashTags -> [$ name];' est invalide parce que vous utilisé les parenthèses '[]' au lieu des accolades '{}' pour un hachage. –