在调用Perl sub时使用&符号和parens

Je *_*Rog 14 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";
Run Code Online (Sandbox Code Playgroud)

输出:

in t
1 2
in s
1 2
out
Run Code Online (Sandbox Code Playgroud)

如您所见,在没有传递参数时&s输出1 2.这是一个功能还是一个bug?

测试版本为5.8.8.

Eug*_*ash 23

使用&NAME;语法调用子例程使当前@_可见.这在perlsub中有记录:

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

所以,这绝对是一个特色.

  • 值得注意的是`@ _`是调用子例程中的SAME数组,所以如果被调用的子例程用`shift`或类似的东西改变`@ _`,那么在`@ _`后可以看到更改电话.(这是效率的来源) (5认同)

TLP*_*TLP 18

&子名称之前使用并且没有传递参数列表时,当前@_将作为参数传递.所以,这是一个功能.

以下是调用子例程的不同方法:

NAME(LIST); # & is optional with parentheses.
NAME LIST;  # Parentheses optional if predeclared/imported.
&NAME(LIST); # Circumvent prototypes.
&NAME;      # Makes current @_ visible to called subroutine.
Run Code Online (Sandbox Code Playgroud)

来自perldoc perlsub

  • `sub foo($$){}`,parens宣布原型.最容易记住的是:使用名称(LIST),除非你有理由不这样做. (2认同)
  • 我觉得你很困惑.我列出的4件事是为了让你概述一个人如何称呼子,以及他们的意思. (2认同)