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

时间:2011-07-15 12:22:28

标签: 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";

输出:

in t
1 2
in s
1 2
out

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

测试版本为5.8.8。

3 个答案:

答案 0 :(得分:23)

使用&NAME;语法调用子例程可使当前@_可见。这在perlsub

中有记录
  

如果使用&形式调用子例程,则参数列表是可选的,如果省略,则不为子例程设置@_数组:@_数组相反,子程序可以看到调用的时间。这是新用户可能希望避免的效率机制。

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

答案 1 :(得分: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.

来自perldoc perlsub

答案 2 :(得分:2)

直接从骆驼嘴里出来:

  

如果使用``&''形式调用子程序,则参数列表是可选的,如果省略,则不为子程序设置@_数组:调用时的@_数组是相反,子程序可见。这是新用户可能希望避免的效率机制。