我有一个函数(让我们称之为foo($array_reference, ...)
),它需要一个数组引用和其他参数。我希望foo
将数组引用从传递给它的参数列表中直接移到数组中,而不必将其作为数组引用移出,然后单独将其转换为数组。
我想要的应该是:
my @bar = @{shift};
我不想要的,但目前仍然坚持:
my $bar = shift;
my @bar = @{$bar}
后一种方法浪费了线条,浪费了记忆,让我讨厌这种类型的Perl代码的作者带着激情。请帮帮忙?
答案 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]};
}