【问题标题】:How to pass parameters in Perl with out data getting altered如何在 Perl 中传递参数而不改变数据
【发布时间】:2016-12-09 13:34:34
【问题描述】:

我有一个无法解决的奇怪问题。你能看看我做错了什么吗?我正在尝试使用 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>

现在的错误:

如下所示,一旦我将 for 循环分拆到子例程,就会出现错误。我正在传递 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);
    }
}

【问题讨论】:

标签: xml perl parameters subroutine


【解决方案1】:
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-&gt;[$i],或者要引用整个数组,请使用@$elementTags。 同样,对于reportHashTags 键查找使用$hashTags-&gt;[$key],或者对于整个哈希使用%$hashTags

【讨论】:

  • 好吧,当我引用哈希时,它会抛出一个错误。这是它的代码。我是 perl sub buildXMLElements() { my($elementTags, $hashTags, $parentElement) = @_;对于我的 $name (@$elementTags) { 我的 $reportTag = $doc->createElement($name);我的 $reportValue = $hashTags->[$name]; $reportTag->appendTextNode($reportValue); $parentElement->appendChild($reportTag);它死在 my $reportValue = $hashTags->[$name]; :(
  • 不要将代码放在注释中。编辑您的原始帖子或使用更新的代码提出新问题。也就是说,代码 $reportValue = $hashTags-&gt;[$name]; 无效,因为您使用括号 [] 而不是大括号 {} 进行哈希。
猜你喜欢
  • 2018-02-12
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
相关资源
最近更新 更多