shift()在Perl中做什么?

66 perl built-in

以下行可能意味着什么?

my $x = shift;
Run Code Online (Sandbox Code Playgroud)

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之外.

  • 我更喜欢自己使用`sub foo {my($ x,$ y,$ z)= @_}`,重复性较低. (3认同)

Aln*_*tak 14

shift函数从数组中删除第一个元素,并返回它.该数组由一个元素缩短.

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

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

  • 应该补充的是,@ _是包含赋予函数的参数的数组,@ ARGV是包含给予程序的参数的数组. (7认同)

Gau*_*rav 6

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

my $x = shift @_;
Run Code Online (Sandbox Code Playgroud)

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


Dav*_*hme 3

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

my ($x) = @_;
Run Code Online (Sandbox Code Playgroud)

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