如何在Perl中传递参数而不改变数据

时间:2016-08-03 17:31:54

标签: xml perl parameters subroutine

我有一个奇怪的问题,我无法解决。你能不能看看我做错了什么。我正在尝试使用XML :: LibXML在Perl中构建XML。一切正常,直到我开始构建子例程并传递参数。

首先使用的代码

 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)无法获取storedReportTag的数组值 2)无法获取%reportHashTag数据 3)$ report元素为空

代码:

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

我想放入sub,因为我有几个标签要构建以重用代码。我尝试直接传递参数并作为参考.......

谢谢

更新

编辑我的Sub后,它现在看起来像这样:

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];

最终更新:

在Jim的帮助下,我更正了代码:这是最终版本的工作

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 个答案:

答案 0 :(得分:3)

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

你做不到。 @_的全部内容将分配给@elementTags。要将数组或散列传递给子例程,必须传递引用。尝试改为

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

现在,在子例程中$elementTags是一个数组引用,$hashTags是一个哈希引用。要引用elementTags使用$elementTags->[$i]的元素或引用整个数组@$elementTags。 同样,对于reportHashTags密钥查找使用$hashTags->[$key],或者对整个哈希使用%$hashTags