Saltar al contenido

Variables locales y globales en perl

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 que alias 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *