voy a copiar la parte pertinente de mi respuesta de the other question aquí.
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};
A diferencia de las matrices vs árbitros de la matriz, hay pocas razones para elegir a devolver un hash de más de un ref hash. Los Hash ref permiten manejos cortos, como el código anterior. Y al contrario de las matrices frente a las referencias, hace que el caso del iterador sea más simple, o al menos evita una variable del intermediario.
for my $key (keys %{some_func_that_returns_a_hash_ref}) {
...
}
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.
Me gustaría agregar que, si bien hacer todo consistentemente, X es una buena regla empírica, no es de suma importancia diseñar una buena interfaz. Llegue un poco lejos con esto y fácilmente puede alterar otras preocupaciones más importantes.
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.
En "mi ($ resultado) = [];", ¿por qué los parens? – ysth
Una vez más, por consistencia, siempre hago mi ($ foo); mi ($ bar, $ baz); Nunca hago 'my $ foo' porque entonces algunos de mis "my's" están en un contexto escalar y algunos están en un contexto de lista. En consecuencia, a veces hago mi ($ cnt) = escalar (@array); que estoy seguro volvería loca a algunas personas .... –