從子程式返回列表
當然,你可以從 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(...);