從子程式返回列表

當然,你可以從 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(...);