2010-10-20 65 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})。您可以添加+,;,(),@_或其他非单词字符以强制解释为代码。