Historia del asunto:
En Perl, se puede restringir el alcance de las variables mediante los operadores my (visibilidad léxica) y local (reasignación temporal dinámica). local se aplica ampliamente para anular variables globales y descriptores especiales (como $_, $/, $@, %ENV).
Problema:
El principal problema es la confusión entre el ámbito dinámico y el léxico. local no crea una nueva variable, sino que temporalmente reemplaza el valor de una variable global (o del paquete) dentro de la ejecución del bloque. Esto es especialmente crítico al reasignar variables como $/ (separador de líneas), $_ (variable por defecto), $^W (bandera de advertencia), %ENV, STDIN/STDOUT.
Solución:
Ejemplo de código:
our $Global = "¡Hola!"; sub change1 { my $Global = "¡Adiós!"; print "$Global "; } sub change2 { local $Global = "¡Adiós!"; print "$Global "; } print "$Global "; # ¡Hola! change1(); # ¡Adiós! print "$Global "; # ¡Hola! change2(); # ¡Adiós! print "$Global "; # ¡Hola!
Características clave:
¿Puede local aplicarse a variables léxicas declaradas con my?
No, local solo funciona con variables globales de paquete. Es impotente sobre los objetos my.
¿Qué sucederá al aplicar local a descriptores especiales, como STDIN?
Se puede reasignar temporalmente STDIN/STDOUT/stdin mediante local, por ejemplo, para sustituir el flujo de entrada/salida en una subrutina sin efecto global. Después de salir del bloque, el manejador se restaurará.
¿Cuál es la crítica diferencia entre local y my en llamadas recursivas a funciones?
local proporciona una pila de valores "push/pop": cada llamada reemplaza temporalmente el valor del paquete, y las llamadas anidadas reciben este valor reemplazado. my proporciona un único valor léxico dentro del bloque sin herencia interna.
En la prueba, se utiliza local para sustituir %ENV, después de salir del bloque hay efectos secundarios inesperados en otros hilos, porque el código es multihilo y local se aplicó inapropiadamente.
Pros:
Contras:
Sustituyen variables especiales ($/, $@, $SIG) solo durante el tiempo de llamada de un bloque necesario, después de lo cual los cambios se revierten correctamente.
Pros:
Contras: