1

我有以下测试代码:

sub one_argument {
     ($a) = @_;
     print "In one argument: \$a = $a\n";
     return "one_argument";
}
sub mul_arguments {
     (@a) = @_;
     return "mul_argument";
}
print &one_argument &mul_arguments "something", "\n";

我的目标是能够更好地理解 perl 如何决定将哪些参数放入每个函数,并可能消除我可能存在的任何误解。我本来希望上面的代码输出:

In one argument: mul_argument
one_argument

但是,以下是输出:

Use of uninitialized value $a in concatenation (.) or string at ./test.pl line 5.
In one argument: $a =
mdd_argument

我不明白 'mdd_argument' 来自哪里(它是对函数的一种引用吗?),以及为什么 one_argument 没有收到任何参数。

我会很感激 perl 在以与上面类似的方式调用它们时如何将参数解析为函数的任何见解。

请注意,这纯粹是一个学习练习,我不需要上面的代码按预期执行,在我自己的代码中我不会以这种方式调用函数。

4

1 回答 1

6

perldoc perlsub

如果使用 & 形式调用子程序,则参数列表是可选的,如果省略,则不会为子程序设置 @_ 数组:调用时的 @_ 数组对子程序可见。这是新用户可能希望避免的一种效率机制。

换句话说,在正常使用中,如果使用 &,则必须使用括号。否则,子例程将传递调用者的@_。

神秘的“mdd”是因为&one_argument没有任何参数而引起的,而 perl 期望一个运算符跟随它,而不是一个表达式。所以&of&mul_arguments实际上被解释为字符串位和运算符:

$ perl -MO=Deparse,-p -e 'sub mul_arguments; print &one_argument &mul_arguments "something", "\n"'
print((&one_argument & mul_arguments('something', "\n")));

并且“one_argument”和“mul_arguments”产生“mdd_argument”。

于 2013-09-18T06:19:40.597 回答