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 @_;