为什么函数作为参数调用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
仍会要求使用数组引用。