为什么函数作为参数调用push原因';不是数组引用';用Perl?

为什么函数作为参数调用push原因';不是数组引用';用Perl?,perl,perl-data-structures,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; 当我尝试运行它时,输出不是位于…的数组引用 我想这是因为&func()的计算结果不是@arr,而是一个简单的列表1,2,3,并且1被视为推送的数组参数。有人能解释一下为什么会发生这种情况吗?因为

有人愿意解释下一件事为什么会发生吗?代码如下:

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

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

sub func
{
    return @arr;
}

push(&func(), 4);

say @arr;
当我尝试运行它时,输出不是位于…的数组引用

我想这是因为
&func()
的计算结果不是
@arr
,而是一个简单的列表
1,2,3
,并且
1
被视为
推送
数组
参数。有人能解释一下为什么会发生这种情况吗?因为在
push
文档中,我没有发现与此相关的内容


提前感谢。

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

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

sub func {
   return \@arr;
}

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

sub func {
   return \@arr;
}

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


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

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

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

sub func {
   return \@arr;
}

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

sub func {
   return \@arr;
}

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


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

return@arr
更改为
return\@arr
@j.w.r,我知道我可以这样做,但为什么
@arr
不起作用?在
push
doc中,据说它接受
ARRAY
作为第一个参数,那么为什么它不接受它呢。我不想问如何让它工作,但为什么它不工作。因为
func()
不返回数组,所以它返回一个列表。各种数组函数(push、pop、shift、splice)可以接受一个数组参数,因为它们具有特殊的功能,但在(大多数)其他情况下,数组会折叠成元素列表。这就是为什么push语句看起来像这样:
push(1,2,3,4)
。将
return@arr
更改为
return\@arr
@j.w.r,我知道我可以这样做,但为什么
@arr
不起作用?在
push
doc中,据说它接受
ARRAY
作为第一个参数,那么为什么它不接受它呢。我不想问如何让它工作,但为什么它不工作。因为
func()
不返回数组,所以它返回一个列表。各种数组函数(push、pop、shift、splice)可以接受一个数组参数,因为它们具有特殊的功能,但在(大多数)其他情况下,数组会折叠成元素列表。这就是为什么push语句看起来像这样:
push(1,2,3,4)
。据我所知,函数总是返回最后一个表达式的结果,而不是变量。是吗?@caligula,
:左值
subs将是例外。当在左值上下文中调用时,它们实际上会返回var。@caligula,…但是如果不提供数组文本(以
@
开头的内容),即使使用
子函数:左值{@arr}
,但
推送
仍会期望数组引用。据我所知,函数总是返回最后一个表达式的结果,不是变量。是吗?@caligula,
:左值
subs将是例外。当在左值上下文中调用时,它们实际上会返回var。@caligula,……但是如果您不提供数组文本(以
@
开头的内容),即使您使用
子函数:左值{@arr}
,则
push
仍会要求使用数组引用。