有两个考虑。显而易见的是,您的阵列会有多大?如果它少于几十个元素,那么大小就不是一个因素(除非你正在为一些快速调用的函数进行微优化,但你必须先做一些内存分析来证明这一点)。
那是容易的部分。经常被忽视的第二个考虑因素是界面。返回的数组将如何使用?这很重要,因为在 Perl 中整个数组解引用有点糟糕。例如:
for my $info (@{ getInfo($some, $args) }) {
...
}
太丑了 这要好得多。
for my $info ( getInfo($some, $args) ) {
...
}
它还适用于映射和 grepping。
my @info = grep { ... } getInfo($some, $args);
但是,如果您要挑选单个元素,则返回数组 ref 可能会很方便:
my $address = getInfo($some, $args)->[2];
这比:
my $address = (getInfo($some, $args))[2];
或者:
my @info = getInfo($some, $args);
my $address = $info[2];
但到那时,您应该质疑@info 是否真的是一个列表或哈希。
my $address = getInfo($some, $args)->{address};
您不应该做的是getInfo()
在标量上下文中返回一个数组 ref 并在列表上下文中返回一个数组。这混淆了标量上下文作为数组长度的传统使用,这会让用户感到惊讶。
最后,我将插入我自己的模块Method::Signatures,因为它为传入数组引用提供了一种折衷方案,而无需使用数组引用语法。
use Method::Signatures;
method foo(\@args) {
print "@args"; # @args is not a copy
push @args, 42; # this alters the caller array
}
my @nums = (1,2,3);
Class->foo(\@nums); # prints 1 2 3
print "@nums"; # prints 1 2 3 42
这是通过Data::Alias的魔力完成的。