En Perl, el ámbito de las variables se define con las palabras clave my y local.
my crea una variable con un ámbito léxico (solo actúa en el bloque actual).local almacena temporalmente el valor actual de una variable global y establece un nuevo valor durante la existencia del bloque; generalmente se utiliza solo con variables globales (por ejemplo, $_, $/ y otras).Ejemplo:
my $x = 42; # visible solo en el bloque actual { local $/ = undef; my $input = <STDIN>; # $/ aquí es undef, después del bloque se restaura el valor }
Es preferible usar my debido a su ámbito más predecible.
¿Qué sucederá al usar my y local con la misma variable, declarada en dos bloques diferentes?
A menudo se responde que
localymyfuncionan igual, pero no es así.localsolo funciona con variables globales (variables de paquete). Una variable declarada conmyes invisible paralocal.
Ejemplo:
our $foo = "global"; { local $foo = "local"; print $foo; # "local" } print $foo; # "global" { my $foo = "lexical"; } # $foo fuera del bloque es la versión global, no "lexical"
Historia
En el script, se utilizó local para sustituir temporalmente una variable declarada con my, lo que no generó ningún resultado y causó errores en el procesamiento de eventos en uno de los módulos internos.
Historia
En el proyecto, "localizamos" $_ a través de local dentro de foreach, esperando reemplazar $_ para los iteradores, olvidando que foreach ya define un nuevo $_. El resultado: un filtro no funcional y una lógica de iteración incorrecta.
Historia
La variable global del paquete no se declaró con our, y el intento de localización mediante local $var provocó la caída del script debido a strict y warnings, y la depuración tomó un día.