shift()在Perl中做什么?

时间:2008-11-17 21:16:35

标签: perl built-in

以下行可能意味着什么?

my $x = shift;

6 个答案:

答案 0 :(得分:54)

shift()是一个内置的Perl子例程,它接受一个数组作为参数,然后返回并删除该数组中的第一个项目。通常的做法是使用shift调用获取传递到子例程的所有参数。例如,假设您有一个带有三个参数的子例程foo。将这些参数分配给局部变量的一种方法是shift,如下所示:

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

这里的混乱是看起来shift不是作为参数传递数组。实际上,它是隐式传递的“默认”数组,在子例程中是@_,在子例程外是@ARGV

答案 1 :(得分:14)

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

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

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

答案 2 :(得分:6)

在Perl中,如果没有显式指定参数,许多方法都使用默认变量($_@_)。您的代码与:

相同
my $x = shift @_;

正如前面的PullMonkey所指出的,在子例程中,@_包含传递给该子例程的参数(如perlsub中所述)。 shift会从@_中移除第一个参数值并将其存储在$x中,因此$_[0]现在会将第二个参数传递给您子程序。

答案 3 :(得分:2)

这通常是一个习惯用语:$ x是分配给传递给子例程的第一个参数的局部变量,但是。

my ($x) = @_;

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

答案 4 :(得分:0)

如果你在一个子程序中,这一行shift@_(传入的参数)。
因此,$x将成为popped数组中的第一项@_

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

答案 5 :(得分:0)

用外行人的语言,从一个非常高级的视角来看, shift 占据了数组的第一个元素(最左边的部分),而相反的是 pop ,这是获取数组的最后一个元素(最右边的部分)。

my @array1=(5,6,7,8,9);
my $x = shift @array1;
print "$x\n"; # 5
print "@array1\n"; # 6 7 8 9