我在perl中有一个返回列表的函数。我的理解是,当foo()被分配到列表时,副本就会生成:
sub foo() { return `ping 127.0.0.1` }
my @list = foo();
然后需要将@list
转移到另一个列表,例如@oldlist = @list;
,并制作另一个副本。所以我想我可以从返回的列表中引用my $listref = \foo();
,然后我可以分配该引用,但这不起作用。
我正在使用的函数运行一个返回一个相当大的列表的命令(ping命令仅用于示例目的),我经常调用它,所以我想尽可能减少副本。什么是处理这个问题的好方法?
答案 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的最后一部分(及其中的链接),例如