以下行可能意味着什么?
my $x = shift;
shift()
是一个内置的 Perl 子程序,它接受一个数组作为参数,然后返回并删除该数组中的第一项。通常的做法是通过shift
调用获取传递给子例程的所有参数。例如,假设您有一个带有foo
三个参数的子例程。将这些参数分配给局部变量的一种方法是shift
:
sub foo() {
my $x = shift;
my $y = shift;
my $z = shift;
# do something
}
这里的困惑是,似乎 shift 没有作为参数传递给数组。事实上,它被隐式传递给“默认”数组,它@_
位于子程序内部或子程序@ARGV
外部。
该shift
函数从数组中删除第一个元素,并将其返回。数组缩短了一个元素。
默认数组(如果没有作为参数给出)是@_
你在一个函数中,或者@ARGV
你在文件范围内。
所以在这种情况下$x
,要么设置为第一个函数参数,要么设置为第一个命令行参数。
在 Perl 中,如果您没有显式指定参数,许多方法会使用默认变量 ($_
和)。@_
您的代码与以下内容相同:
my $x = shift @_;
正如 PullMonkey 之前指出的,在子例程中,@_
包含传递给该子例程的参数(如 参考资料中所述perlsub
)。shift
将从中删除第一个参数值@_
并将其存储在中$x
,因此$_[0]
现在将为您提供传递给子例程的第二个参数。
这通常是一个习惯用法: $x 是分配给传递给子例程的第一个参数的局部变量,尽管如此。
my ($x) = @_;
可能更清楚(并且它不会修改参数列表)。
如果您在子例程中,则此行将shift
打开@_
(传入的参数)。数组中的第一项也是
如此。$x
popped
@_
所以通常你会看到$x = shift if @_;