74

以下行可能意味着什么?

my $x = shift;
4

6 回答 6

63

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

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

这里的困惑是,似乎 shift 没有作为参数传递给数组。事实上,它被隐式传递给“默认”数组,它@_位于子程序内部或子程序@ARGV外部。

于 2008-11-17T21:27:25.853 回答
15

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

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

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

于 2008-11-17T21:24:21.117 回答
10

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

my $x = shift @_;

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

于 2008-11-18T05:25:47.153 回答
3

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

my ($x) = @_;

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

于 2008-11-17T21:17:57.980 回答
3

用外行的话来说,从非常高级的角度来看,shift是取数组的第一个元素(最左边的部分),而相反的是pop,它是取数组的最后一个元素(最右边的部分)。

我的@array1=(5,6,7,8,9);
我的 $x = shift @array1;
打印 "$x\n"; # 5
打印“@array1\n”;# 6 7 8 9
于 2008-11-21T02:59:19.817 回答
1

如果您在子例程中,则此行将shift打开@_(传入的参数)。数组中的第一项也是
如此。$xpopped@_

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

于 2008-11-17T21:25:40.133 回答