perl获取对函数返回的临时列表的引用而不进行复制?

时间:2017-11-13 07:14:53

标签: perl

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

sub foo() { return `ping 127.0.0.1` }

my @list = foo();

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

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

1 个答案:

答案 0 :(得分:6)

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

my $listref = [ foo() ];

但是,你能否开始返回一个arrayref?总的来说,这也是更好的。

你所尝试的“参考了一个列表”......在字面意义上不能做什么;列表仅代表程序中的标量集合,而reference can be taken(我的重点)

  

变量子程序上使用反斜杠运算符。

并且“list”也不是(使用子程序我们需要语法\&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的最后一部分(及其中的链接),例如

相关问题