Существует два соображения. Очевидным является то, насколько большой будет ваш массив? Если это меньше нескольких десятков элементов, тогда размер не является фактором (если вы не оптимизируете микро-функцию для некоторой быстро называемой функции, но вам придется сделать некоторое профилирование памяти, чтобы доказать это в первую очередь).
Это легкая часть. Часто игнорируется второе соображение - интерфейс. Как будет использоваться возвращаемый массив? Это важно, потому что разыменование целых массивов в Perl выглядит ужасно. Например:
for my $info (@{ getInfo($some, $args) }) {
...
}
Это уродливое. Это намного лучше.
for my $info (getInfo($some, $args)) {
...
}
Он также поддается картированию и grepping.
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];
Но в этот момент вы шо uld вопрос, является ли @info действительно списком или хешем.
my $address = getInfo($some, $args)->{address};
То, что вы не должны сделать, это getInfo()
возвращают реф массив в скалярном контексте и массив в контексте списка. Это мешает традиционному использованию скалярного контекста как длины массива, что удивит пользователя.
Наконец, я подключу свой собственный модуль, Method::Signatures, потому что он предлагает компромисс для передачи ссылок на массивы без использования синтаксиса ref 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.
Возможно, вы могли бы объяснить на более высоком уровне то, что вы пытаетесь сделать. Может быть более современный, Perlish способ писать то, что вы хотите, чтобы избежать вашей проблемы в целом. Или, по крайней мере, сделать ваши намерения более ясными. –
@unknown (google): Я часто это делаю в разных контекстах. Последнее время было, когда я хотел прочитать файл в массиве. Таким образом, файл должен быть открыт, я печатаю информацию о том, какой файл я открываю на STDERR, немного модифицирую строки и вставляю их в массив, а затем закройте файл. – Frank
изменить как? как это можно сделать в каждой строке, с указанием карты? я нахожу толкать что-то на массив, чтобы быть очень подозрительным, снова в пользу других методов. иногда это не может помочь, хотя –