Есть два соображения. Очевидным является то, насколько большим станет ваш массив? Если это менее нескольких десятков элементов, то размер не является фактором (если вы не оптимизируете микро для какой-то быстро вызываемой функции, но вам придется выполнить некоторое профилирование памяти, чтобы сначала это доказать).
Это легкая часть. Вторым фактором, который часто упускается из виду, является интерфейс. Как будет использоваться возвращенный массив? Это важно, потому что разыменование целого массива довольно ужасно в Perl. Например:
for my $info (@{ getInfo($some, $args) }) {
...
}
Это ужасно. Это намного лучше.
for my $info ( getInfo($some, $args) ) {
...
}
Он также пригоден для картирования и сопоставления.
my @info = grep { ... } getInfo($some, $args);
Но возврат ссылки на массив может быть полезен, если вы собираетесь выбирать отдельные элементы:
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 , потому что он предлагает компромисс для передачи ссылок на массив без использования синтаксиса ref массива.
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 .