Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何在Perl中传递参数而不改变输出数据_Xml_Perl_Parameters_Subroutine - Fatal编程技术网

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

Xml 如何在Perl中传递参数而不改变输出数据,xml,perl,parameters,subroutine,Xml,Perl,Parameters,Subroutine,我有个奇怪的问题,我不能四处走动。你能看看我做错了什么吗。我正在尝试使用XML::LibXML在Perl中构建XML。在我开始构建子例程并传递参数之前,一切都正常 首先是有效的代码 my $root = $doc->createElement("XML_FILE"); my @sortedOuterTags = qw ( JMS_VERSION FILE_NAME SUBMIT_BY

我有个奇怪的问题,我不能四处走动。你能看看我做错了什么吗。我正在尝试使用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);
}
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);
    }
}
生成输出:

<JMS_VERSION>data1</JMS_VERSION>

<FILE_NAME>data2</FILE_NAME>

<SUBMIT_BY>data3</SUBMIT_BY>

<SUBMIT_DATE>data4</SUBMIT_DATE>
我想加入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的帮助下,我更正了代码:这是最终版本

 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);
}
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);
    }
}
你不能那样做。
@
的全部内容将分配给
@elementTags
。要将数组或散列传递给子例程,必须传递引用。试试看

buildXMLElements(\@sortedReportTag, \%reportHashTags, $report);
...
sub buildXMLElements() {
  my( $elementTags, $hashTags, $parentElement) = @_;
现在,在子例程中,
$elementTags
是数组引用,
$hashTags
是哈希引用。要引用
elementTags
的元素,请使用
$elementTags->[$i]
或引用整个数组do
@$elementTags
。 同样,对于
reportHashTags
键查找,使用
$hashTags->[$key]
,或者对于整个哈希使用
%$hashTags

你不能那样做。
@
的全部内容将分配给
@elementTags
。要将数组或散列传递给子例程,必须传递引用。试试看

buildXMLElements(\@sortedReportTag, \%reportHashTags, $report);
...
sub buildXMLElements() {
  my( $elementTags, $hashTags, $parentElement) = @_;
现在,在子例程中,
$elementTags
是数组引用,
$hashTags
是哈希引用。要引用
elementTags
的元素,请使用
$elementTags->[$i]
或引用整个数组do
@$elementTags

同样,对于
reportHashTags
键查找,使用
$hashTags->[$key]
,或者对于整个哈希使用
%$hashTags

当我引用哈希时,它会抛出一个错误。这是它的代码。我不熟悉perl sub-buildXMLElements(){my($elementTags,$hashTags,$parentElement)=@;对于我的$name(@$elementTags){my$reportTag=$doc->createElement($name);my$reportValue=$hashTags->[$name];$reportTag->appendTextNode($reportValue);$parentElement->appendChild($reportTag);}它在my$reportValue=$hashTags->[$name];;行中消失:(不要在评论中添加代码。编辑您的原始帖子或使用更新的代码问新问题。也就是说,代码
$reportValue=$hashTags->[$name];
无效,因为您使用了括号
[]
而不是大括号
{}
用于哈希。当我引用哈希时,它会抛出一个错误。下面是代码。我不熟悉perl sub-buildXMLElements(){my($elementTags,$hashTags,$parentElement)=@;对于我的$name(@$elementTags){my$reportTag=$doc->createElement($name);my$reportValue=$hashTags->[$name];$reportTag->appendTextNode($reportValue);$parentElement->appendChild($reportTag);}}}它在my$reportValue=$hashTags->[$name];:(不要在注释中添加代码。编辑您的原始文章或用更新的代码问一个新问题。也就是说,代码
$reportValue=$hashTags->[$name];
无效,因为您对哈希使用了括号
[]
而不是大括号
{}