Es un error muy común de los programadores de Perl, confundir el uso de la '@' y del '$' en los arrays.
Una '@' hace referencia a un array, desde luego... pero al array en su conjunto. Si sólo queremos acceder a un sólo elemento, estamos queriendo acceder a un escalar, por lo que estamos obligados a usar el '$'.
En esta línea:
lo que estamos haciendo es:
1.- dado que existe una '@' delante de 'array', Perl convierte a '5' en un array (de un sólo elemento, claro).
2.- Perl coge todos los elementos de ese nuevo array y los distribuye por los elementos de @array indicados por los índices que están entre corchetes. En este caso, sólo hay un '1', por lo que coge el primer elemento del nuevo array (el '5') y lo mete en la posición segunda ([1]) del @array.
Si en las primeras líneas del programa tuvieramos la costumbre de poner
entonces recibiríamos un aviso así:
Scalar value @arr[1] better written as $arr[1] at -e line 1.
Vamos a modificar el ejemplo propuesto por azzwad para intentar verlo mejor:
#!usr/bin/perl
use warnings;
use strict;
#defines valores al arreglo
@arr[0..4] = (11, 12, 13, 14, 15);
#imprimes arreglo
for( $i=0; $i<5; $i++) { print $arr[$i]," " }
Como véis, sí podemos hacer una asignación de estas dos maneras:
@arr[0..4] = (11, 12, 13, 14, 15);
$arr[0] = 11; $arr[1] = 12; $arr[2] = 13; # etc.
pero no así:
@arr[0] = 11; @arr[1] = 12; @arr[3] = 13; # etc.
El uso del '@' debe quedar restringido sólo en el caso de que queramos hacer referencia a más de un elemento. Ejemplo: si queremos pintar los elementos que van desde la posición 1 a la 3 entonces haríamos:
print "@arr[1..3]\n"; # 12 13 14
El uso de '@arr[0]=11;' sólo está permitido a partir del Perl6.