如何将传递的数组引用直接移到数组?

时间:2010-10-20 17:06:53

标签: perl

我有一个函数(让我们称之为foo($array_reference, ...)),它需要一个数组引用和其他参数。我希望foo将数组引用从传递给它的参数列表中直接移到数组中,而不必将其作为数组引用移出,然后单独将其转换为数组。

我想要的应该是:

my @bar = @{shift};

我不想要的,但目前仍然坚持:

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

后一种方法浪费了线条,浪费了记忆,让我讨厌这种类型的Perl代码的作者带着激情。请帮帮忙?

5 个答案:

答案 0 :(得分:10)

不要担心“浪费线,浪费记忆”。这两行代码和内存都很便宜。

您可以像任何阵列一样对@_进行操作,其中包括解除引用。听起来你想要一个:

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

答案 1 :(得分:5)

尝试my @bar = @{shift()};my @bar = @{CORE::shift()};

如果您使用@{shift}启用警告,Perl会警告您use warnings;不明确。

答案 2 :(得分:4)

由于它不在这里,我发现它是消除歧义的最明确的方法:

my @bar = @{shift @_}

此处的每个答案在@{ ... }中添加非单词字符的原因是因为在括号内,shift被视为未加引号的字(类似于abc => 1$hash{key})。您可以添加+;()@_或其他非字字符,以强制解释为代码。

答案 3 :(得分:2)

我认为这有效:

 my @bar = @{(shift)};

答案 4 :(得分:1)

您不必明确转移您的论点; @_包含直接别名。

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

}