Hay dos consideraciones. El más obvio es ¿cuán grande va a ser su matriz? Si se trata de menos de unas pocas docenas de elementos, entonces el tamaño no es un factor (a menos que estés micro-optimizando para alguna función llamada rápidamente, pero tendrías que hacer un poco de perfil de memoria para probarlo primero).
Esa es la parte fácil. La segunda consideración que a menudo se pasa por alto es la interfaz. ¿Cómo se usará la matriz devuelta? Esto es importante porque la desreferenciación de arreglos completos es algo horrible en Perl. Por ejemplo:
for my $info (@{ getInfo($some, $args) }) {
...
}
Eso es feo. Esto es mucho mejor.
for my $info (getInfo($some, $args)) {
...
}
También se presta para mapeo y grepping.
my @info = grep { ... } getInfo($some, $args);
Pero volviendo una ref matriz puede ser útil si usted va a seleccionar elementos individuales:
my $address = getInfo($some, $args)->[2];
Eso es más simple que:
my $address = (getInfo($some, $args))[2];
O:
my @info = getInfo($some, $args);
my $address = $info[2];
Pero en ese punto, usted sho uld pregunta si @info es realmente una lista o un hash.
my $address = getInfo($some, $args)->{address};
Lo que no debe hacer es tener getInfo()
devolver una referencia array en contexto escalar y una matriz en el contexto de lista. Esto confunde el uso tradicional del contexto escalar como la longitud de la matriz que sorprenderá al usuario.
Finalmente, conectaré mi propio módulo, Method::Signatures, porque ofrece un compromiso para pasar referencias de matriz sin tener que utilizar la sintaxis de matriz de 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
Esto se hace a través de la magia de Data::Alias.otros
Tal vez podría explicar en un nivel superior lo que está tratando de hacer. Puede haber una manera más moderna y perlita de escribir lo que desea que evitaría su problema por completo. O al menos haz que tus intenciones sean más claras. –
@unknown (google): Lo hago a menudo en diferentes contextos. La última vez fue cuando quería leer un archivo en una matriz. Entonces el archivo debe ser abierto, imprimo información sobre qué archivo estoy abriendo en STDERR, modifico un poco las líneas y las presiono sobre la matriz, luego cierro el archivo. – Frank
modificar cómo? como podría hacerse por línea, con una declaración del mapa? encuentro que empujar algo en una matriz es altamente sospechoso, una vez más a favor de otras técnicas. a veces no se puede evitar, aunque –