Perl contiene muchas variables mágicas (también llamadas "especiales" o "del sistema") que afectan la ejecución del programa:
$_ — variable por defecto para muchos operadores (foreach, map, grep, while <>, etc.).@_ — matriz de argumentos entrantes dentro de subprogramas.%SIG — hash con manejadores de señales del sistema operativo.my @nums = (1,2,3); foreach (@nums) { $_ *= 2; # ¡se modifica la matriz original! } sub show_args { print "Primero: ", $_[0], " "; } show_args('a','b'); # $_[0] = 'a' $SIG{INT} = sub { print "Capturado Ctrl-C "; exit; };
Cuidado: muchas variables mágicas se modifican de manera implícita; un mal uso puede afectar el estado global del programa.
¿Se puede usar de forma segura la variable global $_ en varios bucles anidados o subprogramas?
Respuesta: No, ya que los bucles anidados o los subprogramas a menudo sobrescriben $_, lo que provoca la pérdida de valor en el contexto externo. Se recomienda usar variables explícitas:
foreach my $x (@a) { foreach my $y (@b) { ... } }
Historia
En un script para procesar grandes registros, se utilizó un bucle while(<FH>) {...}. Dentro del bucle se llamó a una función que, a su vez, ejecutó map sin especificar su propia variable, lo que dañó $_ en el bucle externo, haciendo que se omitieran líneas.
Historia
Al procesar señales a través de %SIG, el desarrollador reemplazó el manejador __DIE__, pero no tuvo en cuenta que esto afecta el comportamiento de todo el proceso, incluyendo módulos de terceros, y experimentó cierres incontrolables ante errores en código ajeno.
Historia
La optimización de la transmisión de argumentos a través de referencia de matriz (@_) dentro de un subprograma y el intento de modificar sus valores directamente sin copiar explícitamente llevaba a cambios inesperados en variables del código externo.