参数传递给Perl子例程的顺序重要吗?当我调试以下代码时:
my $loopCounter = 1;
foreach(@authors) {
my @splitAffiliations = splitAffiliations($params);
my @foundItems = findAffiliationForAuthor($_, @splitAffiliations, $loopCounter);
# Process @foundItems
$loopCounter++;
}
...
sub findAffiliationForAuthor {
my ($author, @affiliations, $aIndex) = @_;
...
}
我发现该变量$loopCounter
在子程序findAffiliationForAuthor
被调用之前就具有一个值,但是在调用之后是未定义的。因此,该子例程接收到前两个参数的值,而接收不到第三个参数的值。但是,当我将参数的顺序更改为:
my @foundItems = findAffiliationForAuthor($loopCounter, $_, @splitAffiliations);
值$loopCounter
保留,并按预期方式通过了子例程。
看来我必须将所有标量变量放在数组变量之前,或者也许不混合使用。听起来对吗?
当然,顺序很重要。
参数按照传递的顺序传递,并且数组参数被展平到参数列表中。参数列表作为@_
列表的内容出现在子例程中。
您实际上不能将数组作为参数传递;它的元素将被提取,并与其他任何参数一起推入列表。
您遇到的问题是因为您处理参数的方式:
my ($author, @affiliations, $aIndex) = @_;
$author
@_
按您的预期获取的第一个元素,但@affiliations
将列表的其余所有内容都包含进去。undef
然后将该值存储在中$aIndex
。
您可以将单个数组传递给子例程,只要它是最后一个参数即可:
my($first_scalar, $second_scalar, @array) = @_;
如果将多个数组传递给子例程:
foo(@array1, @array2);
两个数组的元素都被展平为一个列表,并且子例程无法知道哪个元素来自哪个数组参数。
您可以将引用传递给数组:
sub foo {
my ($scalar1, $array_ref1, $scalar2, $array_ref2) = @_;
# ...
}
然后这样称呼它:
foo(42, \@array1, $some_scalar, \@array2);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句