如何在不更改数据的情况下在 Perl 中传递参数
How to pass parameters in Perl with out data getting altered
我有一个无法解决的奇怪问题。你能看看我做错了什么吗?我正在尝试使用 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);
}
}
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
.
我有一个无法解决的奇怪问题。你能看看我做错了什么吗?我正在尝试使用 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);
}
}
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
.