gpt4 book ai didi

perl 在不复制的情况下获取函数返回的临时列表的引用?

转载 作者:行者123 更新时间:2023-12-02 15:05:01 25 4
gpt4 key购买 nike

我在 perl 中有一个返回列表的函数。据我了解,当 foo() 被分配给列表时,会生成一个副本:

sub foo() { return `ping 127.0.0.1` }

my @list = foo();

然后需要将该 @list 转移到另一个列表,如 @oldlist = @list; 并制作另一个副本。所以我在想我是否可以从返回的列表中引用 my $listref =\foo(); 然后我可以分配该引用,但这是行不通的。

我正在使用的函数运行一个返回相当大列表的命令(ping 命令仅用于示例目的)并且我经常调用它所以我想尽可能减少副本。什么是处理该问题的好方法?

最佳答案

对返回的列表进行匿名数组引用

my $listref = [ foo() ];

但是,你能不能不返回一个 arrayref 开始?这通常也更好。


您尝试的“获取列表的引用”……字面意义上不能做的事情;列表仅代表程序中标量的集合,而reference can be taken (我的重点)

By using the backslash operator on a variable, subroutine, or value.

“列表”也不是(对于子例程,我们需要语法 \&sub_name)

但是,使用 \ 运算符, 会引用列表的每个元素(如果在列表上下文中)

my @ref_of_LIST = \( 1,2,3 );  #-->  @ref_of_LIST: (\1, \2, \3)

或者如果在标量上下文中则为标量,这就是您尝试时发生的情况。由于您的 sub 返回值列表,因此它们由 comma operator 评估并丢弃,一个接一个,直到最后一个。然后引用该标量

my $ref_of_LIST = \( 1,2,3 );  #--> $ref_of_LIST: \3

碰巧,所有这些在没有括号的情况下也适用,使用 \foo()


⟩参见this post的最后一部分(以及其中的链接),例如

关于perl 在不复制的情况下获取函数返回的临时列表的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47258873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com