cow*_*god 54
shift()是一个内置的Perl子例程,它接受一个数组作为参数,然后返回并删除该数组中的第一个项目.通常的做法是通过shift调用获取传递给子程序的所有参数.例如,假设你有一个foo带三个参数的子程序.将这些参数分配给局部变量的一种方法是shift这样的:
sub foo() {
my $x = shift;
my $y = shift;
my $z = shift;
# do something
}
Run Code Online (Sandbox Code Playgroud)
这里的混乱是看起来shift不是作为参数传递数组.实际上,它是隐式传递的"默认"数组,它@_位于子程序内或子程序@ARGV之外.
Aln*_*tak 14
该shift函数从数组中删除第一个元素,并返回它.该数组由一个元素缩短.
默认数组(如果没有作为参数给出)是@_你在一个函数中,或者@ARGV你是否在文件范围内.
因此,在这种情况下$x要么设置为第一个函数参数,要么设置为第一个命令行参数.
在Perl中,如果没有显式指定参数,许多方法都使用默认变量($_和@_).您的代码与以下内容相同:
my $x = shift @_;
Run Code Online (Sandbox Code Playgroud)
正如之前PullMonkey所指出的,在子例程中,@_包含传递给该子例程的参数(如中所述perlsub).shift将从中删除第一个参数值@_并将其存储$x,因此$_[0]现在将为您提供传递给子例程的第二个参数.
这通常是这样的习惯用法:$x 是分配给传递给子例程的第一个参数的局部变量。
my ($x) = @_;
Run Code Online (Sandbox Code Playgroud)
可能更清晰(并且它不会修改参数列表)。