调用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.