当没有使用括号时,Perl参数解析为函数

时间:2013-09-18 06:03:15

标签: perl

我有以下测试代码:

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如何以与上面类似的方式调用函数的任何见解。

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

1 个答案:

答案 0 :(得分:6)

perldoc perlsub

  

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

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

引起神秘的“mdd”是因为&one_argument没有任何参数,而perl期望操作符跟随它,而不是表达式。所以&的{​​{1}}实际上被解释为stringwise位和运算符:

&mul_arguments

和“one_argument”& “mul_arguments”产生“mdd_argument”。