首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当不使用括号时,将Perl参数解析为函数

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

Stack Overflow用户
提问于 2013-09-18 06:03:15
回答 1查看 148关注 0票数 1

我有以下测试代码:

代码语言:javascript
复制
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如何决定哪些参数进入每个函数,并可能消除我可能产生的任何误解。我希望上面的代码能够输出:

代码语言:javascript
复制
In one argument: mul_argument
one_argument

然而,以下是产出:

代码语言:javascript
复制
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如何将参数解析为函数时,以与上面类似的方式调用这些参数,我将不胜感激。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-18 06:19:40

perldoc perlsub

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

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

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

代码语言:javascript
复制
$ 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“。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18864924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档