调用Perl子函数时使用符号和parens
输出:调用Perl子函数时使用符号和parens,perl,Perl,输出: #!/usr/bin/perl sub t { print "in t\n"; print "@_\n"; &s; } sub s { print "in s\n"; print "@_\n"; } t(1,2); print "out\n"; print "@_\n"; 如您所见,&s在未传递任何参数时输出12。这是一个特性还是一个bug 测试版本为5.8.8。当在子名称和未传递参数列表之前使用&时,当前的@将作为参数传递。所以,这是一个特点 以下是
#!/usr/bin/perl
sub t {
print "in t\n";
print "@_\n";
&s;
}
sub s {
print "in s\n";
print "@_\n";
}
t(1,2);
print "out\n";
print "@_\n";
如您所见,&s
在未传递任何参数时输出12
。这是一个特性还是一个bug
测试版本为5.8.8。当在子名称和未传递参数列表之前使用
&
时,当前的@
将作为参数传递。所以,这是一个特点
以下是调用子例程的不同方法:
in t
1 2
in s
1 2
out
从使用
名称调用子例程代码>语法使当前的@
对其可见。这记录在:
如果使用&
表单调用子例程,则参数列表是可选的,如果省略,则不会为子例程设置@
数组:调用时的@
数组对子例程可见。这是一种新用户可能希望避免的效率机制
因此,这绝对是一个特征。直接从骆驼的嘴里:
如果使用`&`形式调用子例程,则参数列表是可选的,如果省略,则不会为子例程设置@数组:调用时的@数组对子例程可见。这是一种新用户可能希望避免的效率机制
真正的问题是,Perl是一个特性还是一个bug?这里你所说的规避原型
是什么意思?sub-foo($$){}
,paren声明了原型。最容易记住的事情是:使用name(LIST),除非你有理由不这样做。我列出了所有可能调用sub的方法,这是perlsub的一段引用。查一查,我想你把自己弄糊涂了。我列出的4件事是为了给你一个如何调用sub的概述,以及它们的含义。另外值得注意的是,@
与调用子例程中的数组相同,因此如果被调用的子例程使用shift
或类似的方式更改@
,然后,在调用后,@
中将显示更改。(这就是效率的来源)并且值得注意的是,使用goto&mysub
可以执行跳转而不是调用,这意味着当前堆栈帧被丢弃,因此不会浪费内存。这样,您就可以递归地编写循环,更确切地说,可以递归地编写尾部循环。看见
NAME(LIST); # & is optional with parentheses.
NAME LIST; # Parentheses optional if predeclared/imported.
&NAME(LIST); # Circumvent prototypes.
&NAME; # Makes current @_ visible to called subroutine.