我有以下测试代码:
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如何以与上面类似的方式调用函数的任何见解。
请注意,这纯粹是一个学习练习,我不需要上面的代码按照我的预期执行,并且在我自己的代码中,我不会以这种方式调用函数。
答案 0 :(得分:6)
如果使用& form,参数列表是可选的,如果省略,则不为子例程设置@_数组:调用时的@_数组对子例程可见。这是新用户可能希望避免的效率机制。
换句话说,在正常使用中,如果使用&,则必须使用括号。否则,子程序将通过调用者的 @_。
引起神秘的“mdd”是因为&one_argument
没有任何参数,而perl期望操作符跟随它,而不是表达式。所以&
的{{1}}实际上被解释为stringwise位和运算符:
&mul_arguments
和“one_argument”& “mul_arguments”产生“mdd_argument”。