En Perl, las variables pueden tener un scoping léxico o dinámico.
my crea una variable con scoping léxico: la variable es visible solo dentro del bloque donde se define.local sobrescribe temporalmente el valor de una variable global (package) con scoping dinámico: el nuevo valor es visible en todas las funciones llamadas hasta salir del bloque.our define una variable global (package), pero solo visible en el bloque léxico actual.Ejemplo:
our $x = 10; sub test_my { my $x = 20; inner(); } sub test_loc { local $x = 30; inner(); } sub inner { print $x; } test_my(); # Imprimirá 10 — my $x no es visible desde inner $| = 1; test_loc(); # Imprimirá 30 — local $x es visible desde inner
local se utiliza para modificar variables de tipo package especiales como $_, $/, $@, etc.
¿Cuál será el resultado de ejecutar el siguiente código y por qué?
our $a = 5; sub outer { my $a = 10; inner(); } sub inner { print $a; } outer();
Respuesta: Imprimirá 5. Porque la variable my $a de outer no es visible desde inner; se utiliza la variable de package $a, declarada con our.
Historia
Historia
Historia
En desarrollo de JavaScript, después de pasar a Perl, los desarrolladores por costumbre intentaban declarar variables con our en todas partes sin necesidad, lo que llevaba a la aparición inesperada de variables globales, interfiriendo con la encapsulación y causando colisiones de nombres.