我有以下测试代码:
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如何将参数解析为函数时,以与上面类似的方式调用这些参数,我将不胜感激。
请注意,这纯粹是一个学习练习,我不需要上面的代码来执行我所期望的,而且在我自己的代码中,我不会以这种方式调用函数。
发布于 2013-09-18 06:19:40
perldoc perlsub
如果使用& form调用子例程,则参数列表是可选的,如果省略,则不会为子例程设置@_数组:调用时的@_数组对子例程是可见的。这是一个新用户可能希望避免的效率机制。
换句话说,在正常使用中,如果使用&,则必须使用括号。否则,子例程将被传递给调用者的@_。
之所以会出现神秘的"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“。
https://stackoverflow.com/questions/18864924
复制相似问题