Nuestros programadores estrellas han agotado sus reservas de café, en su búsqueda diariamente por la resolución, hasta que Alfredo encontró el resultado en GitHub por lo tanto hoy la comparte con nosotros.
Solución:
En términos de alcance, hay dos tipos de variables en Perl.
- Las variables léxicas tienen un ámbito léxico, lo que significa que solo son visibles en el ámbito léxico actual.
- Las variables del paquete tienen un alcance global, lo que significa que son visibles para todo el código del intérprete.
Aquí hay formas de crear variable.
my
crea una variable léxica.our
crea una variable léxica que tiene un alias de la variable del mismo nombre en el paquete actual. En otras palabras,our $foo;
es lo mismo quealias my $foo = $The::Current::Package::foo;
.- Las variables globales se crean en uso.
local
no crea ninguna variable. Simplemente realiza una copia de seguridad de una variable hasta que se destruye el alcance léxico actual.
my
hace lo mismo
No. local
no cambia el alcance de una variable. Mientras que una variable léxica solo es visible en un ámbito léxico, una variable global localizada sigue siendo visible en todo el intérprete.
$x = 123;
sub foo print "$xn";
local $x = 456; foo(); # 456
foo(); # 123
$x = 123;
sub foo print "$xn";
my $x = 456; foo(); # 123
foo(); # 123
para que mas
local
local
se utiliza principalmente para aproximar la funcionalidad de my
para variables que de otro modo no se pueden declarar léxicamente.
(Históricamente, esas eran todas las variables. Desde 5.6, solo las variables de puntuación no se pueden declarar léxicamente).
¿Qué es la variable “global”?
Una variable que se puede ver globalmente, es decir, por cualquier código en el intérprete.
¿Es posible agregar mis variables de alcance en @EXPORT? array y usarlo en otros paquetes?
No. @EXPORT
es utilizado por el exportador. El exportador no podría encontrar nada más que símbolos globales (ya que los archivos se compilan en nuevos ámbitos léxicos), por lo que @EXPORT
solo debe contener símbolos globales.
Hay dos tipos de variables, de ámbito léxico y de ámbito global.
En Perl antes de la versión 5, solo había alcance global. Estas variables son las variables del paquete. Estas variables están disponibles en todas partes del programa si usa el paquete prefix.
los local
La palabra clave se introdujo para proporcionar una forma de alterar el valor de una de estas variables globales del paquete dentro de un alcance limitado, como dentro de una subrutina. Guardará el valor anterior en una pila al ingresar al alcance con el local
declaración, y al salir, restaurará el valor anterior. Estos siguen siendo paquetes globales, lo que significa que todavía están disponibles en todas partes. Si está dentro de un alcance con un local
variable, y llama a una subrutina, esa variable aún es visible dentro de esa subrutina.
los my
La palabra clave se introdujo en la versión 5 y proporciona variables de ámbito léxico. Estas variables solo existen dentro del ámbito donde se declaran. Esto significa que si llama a una subrutina, esa my
La variable no es visible. Al salir de un alcance, el my
las variables simplemente desaparecen. Deberías preferir usar my
variables cuando sea posible, porque no desea que sus variables sean visibles dentro de las subrutinas que llama. No puede utilizar este tipo de variables en el @EXPORT
lista porque estas variables no son visibles fuera de su alcance.
Finalmente, el our
palabra clave es una combinación de ambos, ya que le da una variable que es un paquete global, pero esa variable tiene un alcance léxico. Esto significa que estará disponible en cualquier parte del programa, pero al final del bloque adjunto, ya no podrá hacer referencia a esa variable.
Ejemplo 1:
sub mess_with_foo
$foo=0;
sub myfunc
my $foo=20;
mess_with_foo();
print $foo;
myfunc();
Ejemplo 2:
sub mess_with_foo
$foo=0;
sub myfunc
local $foo=20;
mess_with_foo();
print $foo;
myfunc();
Ejemplo 1 huellas dactilares 20
porque mess_with_foo()
no pude ver my $foo
. No podía cambiarlo. my $foo
sólo puede verse en su ámbito de myfunc()
.
Ejemplo 2 huellas dactilares 0
porque mess_with_foo()
puede ver my $foo
y cambiarlo local $foo
puede verse en su ámbito de myfunc()
Y en el ámbito de cualquier función llamada desde dentro de su ámbito de myfunc()
.
Esa es la única diferencia. Ninguno de los dos my $foo
ni local $foo
serán vistos fuera de su ámbito de myfunc()
.
Si conservas algún titubeo y disposición de avanzar nuestro artículo puedes ejecutar una apostilla y con gusto lo estudiaremos.