从子程序返回列表
当然,你可以从 subs 返回列表:
sub foo {
my @list1 = ( 1, 2, 3 );
my @list2 = ( 4, 5 );
return ( @list1, @list2 );
}
my @list = foo();
print @list; # 12345
但除非你知道自己在做什么**,否则不建议这样**做。
虽然结果在 LIST 上下文中时可以,但在 SCALAR 上下文中,事情并不清楚。我们来看看下一行:
print scalar foo(); # 2
为什么 2
?到底是怎么回事?
- 因为
foo()
在 SCALAR 上下文中进行了评估,所以此列表( @list1, @list2 )
也在 SCALAR 上下文中进行了评估 - 在 SCALAR 上下文中,LIST 返回其最后一个元素。这是
@list2
- 同样在 SCALAR 上下文中,数组
@list2
返回其元素的数量。这是2
。
在大多数情况下,正确的策略将返回对数据结构的引用。
所以在我们的例子中,我们应该做以下事情:
return ( \@list1, \@list2 );
然后调用者做这样的事情来接收两个返回的 arrayrefs :
my ($list1, $list2) = foo(...);