shift()在Perl中做什么?

这条线可能意味着什么?

my $x = shift ; 

shift()是一个内置的Perl子程序,它将一个数组作为参数,然后返回并删除该数组中的第一个项目。 通常的做法是获取所有传入具有shift调用子程序的参数。 例如,假设你有一个带有三个参数的子程序foo 。 将这些参数分配给局部variables的一种方法是像这样shift

 sub foo() { my $x = shift; my $y = shift; my $z = shift; # do something } 

这里的混乱是看起来转移并没有被作为一个parameter passing给一个数组。 实际上,它正在隐式地传递“default”数组,即子例程内的@_或子例程外的@ARGV

shift函数从数组中移除第一个元素,并返回它。 数组缩短了一个元素。

默认数组(如果没有作为参数给出)是@_如果你在函数中,或者@ARGV如果你在文件范围。

所以在这种情况下, $x要么被设置为第一个函数参数,要么被设置为第一个命令行参数。

在Perl中,如果不显式指定参数,许多方法都使用默认variables( $_@_ )。 您的代码与以下内容相同:

 my $x = shift @_; 

正如前面的PullMonkey所指出的那样,在一个子例程中,@_包含传递给该子例程的参数(如perlsub )。 shift将从@_删除第一个参数值,并将其存储在$x ,所以$_[0]现在将给你第二个parameter passing给你的子程序。

这通常是一个成语:$ x是分配给传递给子例程的第一个参数的局部variables,尽pipe如此。

 my ($x) = @_; 

可能更清晰(并且不会修改参数列表)。

用一种外行人的语言,从一个非常高的层次来看, 移动是取数组的第一个元素(最左边的部分),而相反的是取最后一个数组的元素(最右边部分)的popup

我的@ array1 =(5,6,7,8,9);
我的$ x = shift @ array1;
打印“$ x \ n”;  #5
打印“@ array1 \ n”;  #6 7 8 9

如果你在一个子程序中,这行会在@_ (传入的参数)上移动。
所以$x将是从@_数组popped的第一个项目。

所以通常你会看到$x = shift if @_;