我读过的其他帖子:What does assigning 'shift' to a variable mean?
我还使用了perldoc -f shift:
shift ARRAY shift
关闭数组的第一个值并将其返回,将数组缩短1并将所有内容向下移动。如果数组中没有元素,则返回未定义的值。如果省略
ARRAY
,则将@_
数组移动到子例程和格式的词法范围内,并将@ARGV
数组移出子例程之外,并且也移动到{{1}建立的词法范围内}},eval STRING
,BEGIN {}
,INIT {}
,CHECK {}
和UNITCHECK {}
构造。另请参阅
END {}
,unshift
和push
。pop
和shift
对unshift
和pop
到右端的数组的左端执行相同的操作。
我理解在子程序之外,数组是push
,内部参数通过@ARGV
传递
我已经阅读了无数关于如何使用@_
函数的教程,但它总是关于数组,以及它如何删除数组开头的第一个元素并返回它。但我有时会看到
shift
似乎没有任何东西对我有意义,我觉得我不能继续阅读,直到我理解它是如何工作的,因为它是一个基本的构建块"语言。
我不太确定是否需要代码示例,因为我相信相同的原则适用于所有使用shift的程序。但如果错了,我可以提供一些代码示例。
答案 0 :(得分:3)
这取决于你的背景。
在所有情况下,shift会删除列表索引0处的元素并将其返回,将所有剩余元素向下移动一个。
在子内部,没有参数的移位(裸移)在@_子例程参数列表上运行。
假设我致电mysub('me', '22')
sub mysub {
my $self = shift; # return $_[0], moves everything else down, $self = 'me', @_ = ( '22' )
my $arg1 = shift; # returns $_[0], moves everything down, $arg1 = '22', @_ = ()
}
在子外部,它在@ARGV命令行参数列表上运行。
鉴于一个论点,shift会在该列表上运行。
my @list1 = ( 1,2,3,4,5 );
my $first = shift @list1; # $first = 1, @list1 = (2,3,4,5)
答案 1 :(得分:1)
它从数组中删除第一个元素并将其返回。
如果@_
包含元素("foo","bar",123)
,则声明
$eg = shift; # same as $eg = shift @_
将值"foo"
分配给变量$eg
,并留下包含@_
元素的("bar",123)
。
这是该语言的基本构建块。您将经常在子例程的开头看到此构造,因为它是将子例程(@_
)的参数复制到其他变量的方法之一。
sub func {
my $x = shift; # put first arg into $x
my $y = shift; # put second arg into $y
my @z = @_; # put remaining args into @z
...
}
$r = func(1,2,"foo");