Solución:
Realmente deberías estar usando use strict;
y use warnings;
en su código. Tenerlos activados le permitirá identificar errores en su código.
Cambie todas las instancias de lo siguiente:
foreach $name (@names)
-> for my $i (@names)
ya que no haces nada con los elementos en el @names
formación.
@numbers[i]
-> $numbers[$i]
ya que aquí es donde ha cometido un error no infrecuente al usar un segmento de matriz en lugar de referirse a un elemento de matriz.
Esto no es C. Cada ‘variable’ tiene que tener un sigilo ($
, @
, %
, &
, etc.) delante de él. Ese i
realmente debería ser $i
.
En cuanto a la diferencia entre push
y shift
, la documentación explica:
perldoc -f push
:
presione ARRAY, LIST
Trata a ARRAY como una pila y empuja los valores de LIST al fin de ARRAY. La longitud de ARRAY aumenta con la longitud de LIST. … Devuelve el número de elementos en la matriz después del “empuje” completado.
perldoc -f unshift
:
unshift ARRAY, LIST
Hace lo contrario de un turno. O lo contrario de un empujón, dependiendo de cómo se mire. Antepone la lista a la parte delantera de la matriz y devuelve el nuevo número de elementos de la matriz.
Para decirlo ASCII-matemáticamente …
+---------+ +-----------+ +---------+
<----- | ITEM(S) | -----> | (@) ARRAY | <----- | ITEM(S) | ----->
shift +---------+ unshift +-----------+ push +---------+ pop
^ ^
FRONT END
unshift
se utiliza para agregar un valor o valores a la comienzo de una matriz:
¿Hace lo contrario de un
shift
. O lo contrario de unpush
, dependiendo de cómo se mire.
Los nuevos valores se convierten en los primeros elementos de la matriz.
push
agrega elementos a la fin de una matriz:
Golosinas
ARRAY
como una pila, y empuja los valores deLIST
al final deARRAY
.
Esto realmente debería ser un comentario, pero es demasiado largo para un cuadro de comentarios, así que aquí está.
Si desea ilustrar la diferencia entre unshift y push, lo siguiente sería suficiente:
#!/usr/bin/perl
use strict; use warnings;
my @x;
push @x, $_ for 1 .. 3;
my @y;
unshift @y, $_ for 1 .. 3;
print "@x = @xn@y = @yn";
Producción:
@x = 1 2 3 @y = 3 2 1
Nota use strict;
lo protege contra muchos errores del programador y use warnings;
le advierte cuando utiliza construcciones de dudoso valor. A tu nivel, ninguno es opcional.