2015-01-06 78 views
2

我想編寫一個Perl子程序first,它將列表作爲輸入,返回列表中的第一個元素並從列表中刪除第一個元素。修改子程序參數(Perl)

像這樣:

@list = (1,2,3); 
print first(@list); // 1 
print @list; // 23 

這是不大的工作:

sub first(@) { 
    return shift @_; 
} 

我得到的是:

print first(@list); // 1 
print @list; // 123 

堆棧變量@_改變我希望它的方式(首先它是(1, 2, 3)然後它是(2, 3)),但我給出的列表作爲輸入(@list)沒有改變。我認爲堆棧變量保存對其引用的變量的引用。

當我在子程序更改列表元素,也改變@list的東西,但不是我想的,但一個+ 1,所以,如果我在子程序我寫:

@_[0] = "X"; 

並執行子程序打印@list後,我會得到2X6

+1

爲什麼不使用'shift'來實現呢? –

+0

這就是我在子程序 – d9h

+2

中所做的,但是您爲什麼要編寫子程序?當你可以簡單地使用'shift'? –

回答

2

您需要在@原型前加一個斜槓才能獲取數組引用,然後修改引用。如果您只使用@,您將在子例程中獲得數組@list的副本(因此不會修改父級中的數組)。從http://perldoc.perl.org/perlsub.html#Prototypes

沒有背部的原型字符有特殊的含義。任何 unbacklashed @或%吃剩下的所有參數,並強制列表 上下文。

所以,你可以寫:

use strict; 
use warnings; 

sub first (\@) { 
    my $a = shift; 
    return shift @$a; 
} 

my @list = (1,2,3); 
print first(@list) . "\n"; 
print "@list" . "\n"; 

輸出:

1 
2 3 
1

你沒有列出在那裏,你有數組。 Perl中的數組和列表是不同的(正如great blog post所解釋的)。如果你有一個名爲@list的數組,那麼你只能保證自己(和將來維護你的代碼的人)混淆。