Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不使用括号时将Perl参数解析为函数_Perl - Fatal编程技术网

不使用括号时将Perl参数解析为函数

不使用括号时将Perl参数解析为函数,perl,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"; 我的目标

我有以下测试代码:

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_参数”从何而来,它是对函数的一种引用吗?以及为什么一个_参数不接收参数

如果能深入了解perl如何将参数解析为函数,我将不胜感激

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

:

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

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

之所以会出现神秘的mdd,是因为&one_参数没有任何参数,perl希望后面跟着一个操作符,而不是一个表达式。因此&of&mul_参数实际上被解释为字符串位和运算符:

$ perl -MO=Deparse,-p -e 'sub mul_arguments; print &one_argument &mul_arguments "something", "\n"'
print((&one_argument & mul_arguments('something', "\n")));
一个参数和多个参数产生mdd参数。

:

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

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

之所以会出现神秘的mdd,是因为&one_参数没有任何参数,perl希望后面跟着一个操作符,而不是一个表达式。因此&of&mul_参数实际上被解释为字符串位和运算符:

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

一个参数&mul参数生成mdd参数。

如前所述,您的代码根本不会在Perl 5.12上运行。您确定在这个问题中完全复制了您的测试代码吗?如前所述,您的代码根本没有在Perl 5.12上运行。你确定你在这个问题上完全复制了你的测试代码吗?谢谢你的回答。我使用的是PerlV5.10.1。除了顶部的解释器之外,这正是我正在使用的代码。perldoc说参数列表是可选的,但是如果它存在会发生什么呢?编辑:哎呀,有点打字错误。底线应该有“&mul_参数”,而不是“&mul_参数”,如果它存在,例如&foobar它被传递;但要呈现它,你必须有括号。谢谢你的回答。我使用的是PerlV5.10.1。除了顶部的解释器之外,这正是我正在使用的代码。perldoc说参数列表是可选的,但是如果它存在会发生什么呢?编辑:哎呀,有点打字错误。底线应该有“&mul_参数”,而不是“&mul_参数”,如果它存在,例如&foobar它被传递;但要呈现它,必须有括号。