shift()在Perl中做什么?

shift()在Perl中做什么?,perl,built-in,Perl,Built In,下面这句话可能是什么意思 my $x = shift; 这通常是:$x是一个局部变量,分配给传递给子例程的第一个参数 my ($x) = @_; 可能更清楚(并且它不会修改参数列表)。函数从数组中删除第一个元素,并返回它。数组缩短了一个元素 如果您在函数中,则默认数组(如果未作为参数提供)为@,如果您在文件范围中,则默认数组为@ARGV 因此,在这种情况下,$x要么被设置为第一个函数参数,要么被设置为第一个命令行参数。如果您在子程序中,此行将在@上移动(传入的参数)。 因此,$x将是从@数组

下面这句话可能是什么意思

my $x = shift;

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

my ($x) = @_;

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

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

如果您在函数中,则默认数组(如果未作为参数提供)为
@
,如果您在文件范围中,则默认数组为
@ARGV


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

如果您在子程序中,此行将
@
上移动(传入的参数)。
因此,
$x
将是从
@
数组中弹出的第一项

所以通常你会看到,
$x=shift如果@

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

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

这里的混乱之处在于shift似乎没有作为参数传递数组。事实上,它被隐式传递“default”数组,即子例程内部的
@
,或子例程外部的
@ARGV

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

my $x = shift @_;

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

用外行的话说,从非常高级的角度来看,是获取数组的第一个元素(最左边的部分),而另一个则是取数组的最后一个元素(最右边的部分)

my@array1=(5,6,7,8,9); 我的$x=shift@array1; 打印“$x\n”#5. 打印“@array1\n”#6 7 8 9
或者@ARGV,如果你不在一个函数中(见我的答案),你不想在sub的名字后面加上“()”,它应该是“sub foo{…”。使用“()”,你是说foo不接受任何参数,这不是你想要的,在这种情况下,我更喜欢使用
sub foo{my($x,$y,$z)=@}
if,它的重复性较低。应该补充的是,@u是包含给定给函数的参数的数组,@ARGV是包含给定给程序的参数的数组。不需要if。“my$x=shift;”和“my$x;$x=shift if@是等效的,如果@为空,则两者都将导致$x未定义,也不会违反strict或发出警告。唯一的区别是您必须键入的数量。Perl为每个标准函数都内置了文档。它们也是联机的。在本例中,“。”不管他是否在谷歌上搜索过它。这是一个很好的问题,肯定应该成为堆栈溢出数据库的一部分。@friedo-100%同意!这不应该成为“向我阅读文档”网站。
perldoc-f shift
包含来自“perlfunc”的有用信息。请参阅,甚至。没有一个答案能够很好地链接/提取文档。因此,无论“RTFM”与否,都应该包含参考资料。 my @array1=(5,6,7,8,9); my $x = shift @array1; print "$x\n"; # 5 print "@array1\n"; # 6 7 8 9