2016-08-03 2 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 paramenters를 지나가고있다. 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

와우! 고맙습니다. 그냥 시도하고 작동 – sannag

+0

글쎄, 내가 해시를 참조하면 오류가 발생합니다. 여기에 대한 코드가 있습니다.나는 펄 신규 빌드 XMLElements() { 내 ($ 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]; : – sannag

+0

코멘트에 코드를 넣지 마십시오. 원래 게시물을 편집하거나 업데이트 된 코드로 새로운 질문을하십시오. 즉, $ reportValue = $ hashTags -> [$ name]; 코드는 유효하지 않습니다. 해시를 위해 {{}'중괄호 대신 []을 사용했습니다. –