将转移分配给变量

时间:2014-07-14 21:41:48

标签: perl subroutine shift

我读过的其他帖子:What does assigning 'shift' to a variable mean?

我还使用了perldoc -f shift

shift ARRAY
shift
     

关闭数组的第一个值并将其返回,将数组缩短1并将所有内容向下移动。如果数组中没有元素,则返回未定义的值。如果省略ARRAY,则将@_数组移动到子例程和格式的词法范围内,并将@ARGV数组移出子例程之外,并且也移动到{{1}建立的词法范围内}},eval STRINGBEGIN {}INIT {}CHECK {}UNITCHECK {}构造。

     

另请参阅END {}unshiftpushpopshiftunshiftpop到右端的数组的左端执行相同的操作。

我理解在子程序之外,数组是push,内部参数通过@ARGV传递

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

shift

似乎没有任何东西对我有意义,我觉得我不能继续阅读,直到我理解它是如何工作的,因为它是一个基本的构建块"语言。

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

2 个答案:

答案 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");