Tiene que pasar cada una de las matrices como una referencia, de lo contrario su @x
en el sub engullirá toda la matriz de argumentos, dejando @y
un arraay vacío y $z
un valor undef.
Esto sucede porque the comma operator - en un contexto lista - a su vez, un @x, @y, $z
en una sola matriz que consiste de todos los elementos de @x
seguidas por todos los elementos de @y
y luego un valor de $z
; su @x
en el sub engullirá toda la matriz de argumentos combinada, dejando @y
como una matriz vacía y $z
como valor undef.
Otra posible fuente de confusión es el hecho de que nombró las dos variables @x
, a pesar de que son completamente independientes entre sí debido a las reglas de alcance. Una buena práctica sería nombrarles algo distinto para evitar tener que adivinar cuál pretendía usar, p. Ej. llame al primer arreglo de la subrutina @x2
.
Tenga en cuenta que puede pasar la matriz como referencia de una de dos maneras: la referencia a la matriz original (aproximación real de paso por referencia) y la referencia a una COPIA de la matriz, que se comportará como si quisieras que tu código origainal se comporte y pase de valor.
use strict; use warnings;
my @x = qw(AAAA BBBB CCCC DDDD EEEE);
my @y = qw(1111 2222 3333 4444 5555);
my $z = "hello";
Hello(\@x,\@y,$z);
# If you wish to pass a reference of a COPY of the array,
# so that you can modify it inside the subroutine without modifying the original,
# instead call Hello([@x], [@y], $z);
exit(0);
sub Hello {
my ($x2,$y2,$z2) = @_;
# Now, you de-reference array reference $x2 via @$x2 or $x2->[$i]
# where previously you used @x2 or $x2[$i]
print "$_\n" for @$x2;
print "$_\n";
print "$_\n" for @$y2;
print "$_\n";
print "$z2\n";
}
en el interés de la divulgación completa, libro de Perl Best Practices desalienta el uso de prototipos sub (Me arriba-Vote su respuesta si se aclaró thusly) - http://stackoverflow.com/questions/3991474/ is-using-prototypes-to-declare-array-reference-context-on-subroutine-args-a-good/3991558 # 3991558 – DVK