从子程序返回列表

当然,你可以从 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?到底是怎么回事?

  1. 因为 foo()SCALAR 上下文中进行了评估,所以此列表 ( @list1, @list2 ) 也在 SCALAR 上下文中进行了评估
  2. SCALAR 上下文中,LIST 返回其最后一个元素。这是 @list2
  3. 同样在 SCALAR 上下文中,数组 @list2 返回其元素的数量。这是 2

在大多数情况下,正确的策略将返回对数据结构的引用
所以在我们的例子中,我们应该做以下事情:

 return    ( \@list1, \@list2 );

然后调用者做这样的事情来接收两个返回的 arrayrefs

 my ($list1, $list2) = foo(...);