2010-10-20 49 views
4

我有一個函數(我們稱之爲foo($array_reference, ...)),它需要其他參數中的數組引用。我希望foo將數組引用從傳遞給它的參數列表中直接移到數組中,而不必將它作爲數組引用移出,然後單獨將其轉換爲數組。如何將通過數組引用直接移入數組?

我想應該是這樣的:

my @bar = @{shift}; 

我不想要什麼,但我現在堅持:

my $bar = shift; 
my @bar = @{$bar} 

後一種方法廢物線,浪費內存,並導致我以熱烈的激情憎恨這類Perl代碼的作者。請幫助?

+2

你如何看待浪費內存? – Ether 2010-10-20 17:25:47

+0

事實上,爲了編寫可讀的代碼,我浪費了那幾行,並寫了我的$ bar = shift; my @bar = @ $ bar; 經驗告訴我不要寫perl golf,至少在生產代碼中。 – jira 2010-10-20 20:36:58

+0

@Ether:浪費內存導致您有一個額外的變量($ bar)實例化,您永遠不需要。 @jira:它很醜,可讀性較差。您正在創建您永遠不需要的額外變量,並將應該只需要一行的任務分解爲兩部分。我將所有複雜的語句分隔成多個語句/行,但這隻有在[i]必要時才應該完成[/ i]。把簡單的任務分解成單獨的語句是浪費的,可讀性較差,應該避免IMO。 – Eli 2010-10-21 20:39:33

回答

10

不要擔心「廢物線,浪費記憶。」這兩行代碼和內存都很便宜。

你可以像數組@_操作,這包括取消引用。這聽起來像你想的一個:

my @bar = @{+shift}; 
my @bar = @{$_[0]}; 
+0

第一個看起來可能是我想要的。什麼是「+」呢? – Eli 2010-10-20 17:18:15

+2

@Eli:IIRC,強制標量上下文。 – Daenyth 2010-10-20 17:27:46

+4

@Eli,請參閱perlop中的「一元+」:http://perldoc.perl.org/perlop.html#Symbolic-Unary-Operators – friedo 2010-10-20 18:27:23

5

嘗試my @bar = @{shift()};my @bar = @{CORE::shift()};

Perl會警告你,@{shift}如果啓用了警告與use warnings;是ambigous。

2

我想這樣的作品:

my @bar = @{(shift)}; 
1

您沒有明確改變你的論點; @_包含他們的直接別名。

sub my_method 
{ 
    my $this = shift; 
    my @array = @{$_[0]}; 

} 
4

因爲它不是在這裏,我覺得它最清晰的方式來消除歧義:

my @bar = @{shift @_} 

,每個在這裏的答案增加了@{ ... }內的非文字字符的原因是因爲括號內,shift被視爲未加引號的裸號(類似於abc => 1$hash{key})。您可以添加+,;,(),@_或其他非單詞字符以強制解釋爲代碼。