Perl 给变量赋值移位

Perl 给变量赋值移位,perl,subroutine,shift,Perl,Subroutine,Shift,我读到的其他线程: 我还使用了: 将数组的第一个值移开并返回它,将数组缩短1并向下移动所有内容。如果数组中没有元素,则返回未定义的值。如果省略了ARRAY,则将@数组移到子例程和格式的词法范围内,将@ARGV数组移到子例程的词法范围外,也移到由eval STRING,BEGIN{},INIT{},CHECK{},UNITCHECK}建立的词法范围内和结束{}构造 另请参见unshift、push和popshift和unshift对数组的左端执行与pop和将推到右端相同的操作 我知道在子程序之外,

我读到的其他线程:

我还使用了:

将数组的第一个值移开并返回它,将数组缩短1并向下移动所有内容。如果数组中没有元素,则返回未定义的值。如果省略了
ARRAY
,则将
@
数组移到子例程和格式的词法范围内,将
@ARGV
数组移到子例程的词法范围外,也移到由
eval STRING
BEGIN{}
INIT{}
CHECK{}
UNITCHECK}建立的词法范围内
结束{}
构造

另请参见
unshift
push
pop
shift
unshift
对数组的左端执行与
pop
推到右端相同的操作

我知道在子程序之外,数组是
@ARGV
,内部参数是通过
@
传递的

我已经阅读了无数关于如何使用
shift
函数的教程,但总是关于数组,以及它如何删除数组开头的第一个元素并返回它。但我有时看到

$eg = shift;
~do more things here~
对我来说,似乎没有什么是有意义的,我觉得在我理解它的工作原理之前,我无法继续阅读,因为它是语言的“基本构建块”


我不太确定是否需要一个代码示例,因为我相信相同的原则适用于所有使用shift的程序。但是如果错误,我可以提供一些代码示例。

它从数组中删除第一个元素并返回它

如果
@
包含元素
(“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");

它从数组中删除第一个元素并返回它

如果
@
包含元素
(“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");

这取决于你的背景

在所有情况下,shift都会删除列表索引0处的元素并返回该元素,同时将所有剩余元素下移一位

在子例程中,不带参数的移位(裸移位)操作子例程参数的@列表

假设我调用
mysub('me','22')

在sub之外,它在命令行参数的@ARGV列表上操作

给定一个参数,shift对该列表进行操作

 my @list1 = ( 1,2,3,4,5 );
 my $first = shift @list1; # $first = 1, @list1 = (2,3,4,5)

这取决于你的背景

在所有情况下,shift都会删除列表索引0处的元素并返回该元素,同时将所有剩余元素下移一位

在子例程中,不带参数的移位(裸移位)操作子例程参数的@列表

假设我调用
mysub('me','22')

在sub之外,它在命令行参数的@ARGV列表上操作

给定一个参数,shift对该列表进行操作

 my @list1 = ( 1,2,3,4,5 );
 my $first = shift @list1; # $first = 1, @list1 = (2,3,4,5)

但是,在一个程序中会是什么样子呢?(“foo”,“bar”,123”)去哪里了?啊,我没有意识到数组上的第一个元素实际上被分配给了变量。:)但是在程序中会是什么样子呢?(“foo”,“bar”,123”)去哪里了?啊,我没有意识到数组中的第一个元素实际上被分配给了变量。:)如果你根本不调用子程序中的任何东西呢?那么shift做什么呢?您是否在问“当数组已经为空时,shift返回什么?”然后回答是
undef
。您已经引用的
perldoc-f shift
文档中提到了该细节!如果你根本不调用子程序中的任何东西呢?那么shift做什么呢?您是否在问“当数组已经为空时,shift返回什么?”然后回答是
undef
。您已经引用的
perldoc-f shift
文档中提到了该细节!