#!/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。
答案 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.
答案 2 :(得分:2)
直接从骆驼嘴里出来:
如果使用``&''形式调用子程序,则参数列表是可选的,如果省略,则不为子程序设置@_数组:调用时的@_数组是相反,子程序可见。这是新用户可能希望避免的效率机制。