2016-08-03 1 views
0

私は好奇心の問題があります。私が間違っていることを見てください。私はXML :: LibXMLを使ってPerlでXMLを構築しようとしています。私がサブルーチンを構築して引数を渡すまでは、すべて正常に動作します。アウトデータが変更されているPerlでパラメータを渡す方法

まず

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

出力をビルド動作するコード:今すぐ

<JMS_VERSION>data1</JMS_VERSION> 

<FILE_NAME>data2</FILE_NAME> 

<SUBMIT_BY>data3</SUBMIT_BY> 

<SUBMIT_DATE>data4</SUBMIT_DATE> 

エラー:できるだけ早く私は以下のショーとしてサブルーチンにループのためのスピンオフとして

をエラーが発生します。私は3つのパラメタを渡しています。 1)%のreportHashTagデータを取得することはできません)storedReportTag 2の配列の値を取得することはできません 3)$レポート要素が空である

コード:

私は私のように、サブに入れたい
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); 
    } 
} 

コードを再利用するためにビルドするためのタグがいくつかあります。それは

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

:それは次のようになります私のサブを編集した後

:私は

はあなたに

更新をありがとう.......両方の直接およびリファレンスとしてパラメータを渡してみました次の行で死ぬ:

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

最終更新日:

ジムの助けを借りて

私は、コードを修正:ここではあなたがそれを行うことはできません

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

答えて

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

の作品の最終バージョンです。 @_の全内容は@elementTagsに割り当てられます。配列やハッシュをサブルーチンに渡すには、参照を渡す必要があります。サブルーチン$elementTagsで、今の代わりに

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

を試してみては、配列の参照である、と$hashTagsはハッシュリファレンスです。 elementTagsの要素を参照するには$elementTags->[$i]を使用するか、配列全体を参照するには@$elementTagsを実行します。 同様に、reportHashTagsキー検索では$hashTags->[$key]、ハッシュ全体では%$hashTagsとなります。

+0

Wow!ありがとうございました。ちょうど試して、それは動作します – sannag

+0

私はエラーをスローするハッシュを参照するときまあ。ここにそのコードがあります。私はperl sub buildXMLElements()の初心者です{ my($ elementTags、$ hashTags、$ parentElement)= @ _; my $ name(@ $ elementTags){ my $ reportTag = $ doc-> createElement($ name); my $ reportValue = $ hashTags - > [$ name]; $ reportTag-> appendTextNode($ reportValue); $ parentElement-> appendChild($ reportTag); } }これは、my $ reportValue = $ hashTags - > [$ name];という行で死にます。 :( – sannag

+0

あなたが元の投稿を編集するか、更新されたコードを使って新しい質問をするかのように、 '$ reportValue = $ hashTags - > [$ name];というコードは無効ですハッシュのために '{}'のかっこの代わりに '[]'を使用しました。 –

関連する問題