2014-07-14 38 views
1

其他線程:What does assigning 'shift' to a variable mean?分配移位到我讀取變量

我也使用perldoc -f shift

shift ARRAY 
shift 

位移陣列關閉的第一個值,並返回它,縮短陣列由1並把所有東西都搬下來如果數組中沒有元素,則返回未定義的值。如果省略ARRAY,轉移子程序和格式的詞法範圍內@_陣列和子例程的外部,並且還內由eval STRINGBEGIN {}INIT {}CHECK {}UNITCHECK {}END {}構建體建立的詞法作用域的@ARGV陣列。

另請參閱unshiftpushpopshiftunshiftpoppush做的數組的左端做了同樣的事情。

我明白子程序之外,該陣列是@ARGV和內部參數通過@_

我讀過關於如何使用shift功能無數教程過去了,但它總是關於陣列,以及如何它將刪除數組開頭的第一個元素並將其返回。但我看到有時

$eg = shift; 
~do more things here~ 

看起來好像沒有什麼是決策意識給我,我覺得我不能繼續讀書更多,直到我理解它是如何工作的,因爲它是一個「基本構建塊」的語言。

我不太確定是否需要一個代碼示例,因爲我相信相同的原則適用於所有使用shift的程序。但如果錯了,我可以提供一些代碼示例。

回答

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名單上。

給出一個論點,輪班在該清單上進行操作。

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

如果你不調用任何東西那麼這個子程序是什麼呢?那麼這個轉換是做什麼的呢? – Hae0

+1

你問「當數組已經是空的時候什麼時候會返回?」,那麼答案是'undef'。'perldoc -f shift'文檔中提到了這個細節你已經引用了! – tobyink

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"); 
+0

但是在程序中看起來如何? (「foo」,「bar」,123「)在哪裏去?還有啊,我沒有意識到數組上的第一個元素實際上是賦值給變量的:) – Hae0