以下行可能意味着什么?
my $x = shift;
答案 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