为什么函数调用作为push的参数导致Perl中的'Not a ARRAY reference'?

时间:2012-09-17 18:18:49

标签: perl perl-data-structures

有人会如此愉快地解释为什么接下来会发生什么?这是代码:

#!/usr/bin/perl
use v5.14;
use warnings;

my @arr = (1, 2, 3);

sub func
{
    return @arr;
}

push(&func(), 4);

say @arr;

当我尝试运行它时,输出为Not an ARRAY reference at ...

我认为这是因为&func()不评估@arr,而是评估普通列表1, 2, 31被视为ARRAY参数push。有人可以解释为什么会发生这种情况,因为在push文档中我发现没有任何相关内容。

提前致谢。

1 个答案:

答案 0 :(得分:4)

sub不可能返回一个数组。您将返回在列表上下文中评估数组的结果,也就是说您将返回其内容列表。显然,这不是你想要的。

push现在将接受对数组的引用,因此您可以使用

sub func {
   return \@arr;
}

push(func(), 4);

请注意,push直到最近才需要数组文字,因此如果您想要向后兼容,请使用以下内容:

sub func {
   return \@arr;
}

push(@{ func() }, 4);

PS - 请注意,我删除了&。你为什么要告诉Perl忽略没有原型的子原型?