• Publicidad

my y local

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

my y local

Notapor alexclipse » 2012-04-22 14:15 @635

Nos han puesto un ejercicio que consiste en explicar las diferencias entre las variables locales y restringidas, con un ejemplo. Solo quiero saber si queda claro de la forma en la que lo he hecho.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. numeros ();                          #Mostraremos en pantalla el resultado de la función "numeros".
  2. sub numeros {                        #Defino la función numeros.
  3. my $a = 5;                           #Defino una variable restringida con my, en este caso $a.
  4. my $b = 10;                          #Defino otra variable restringida con my.
  5. local $c = 500;                      #Defino una variable local.
  6. local $d = 1000;                     #Defino otra variable local.
  7. suma ();                             #Ejecuto la función "suma".
  8. print "$suma2\n";                    #Imprimo el valor de $suma2.
  9. }
  10. sub suma {                           #Defino la función "suma".
  11. local $suma = $a + $b + $c + $d;     #Defino la variable local "suma" como la suma de las variables
  12.                                      #definidas en la función números, es decir, $a,$b,$c y $d.
  13. print "$suma\n";                     #Imprimo el valor de la variable $suma.
  14. }
  15. sub suma2 {                          #Defino la función "suma2"
  16. my $suma2 = $a + $b + $c + $d;       #Defino la variable restringida $suma2.
  17. }
  18.  
  19. #Si no hubiese diferencias entre las variables locales (local) y las variables restringidas (my),
  20. #el programa me devolvería dos veces el valor 1515, pero al ejecutarlo comprobamos que no es así.
  21. #Nos devuelve un solo valor, que es 1500. ¿A qué se debe esto? En primer lugar, en la función "numeros"
  22. #hemos definido cuatro variables, dos restringidas ($a y $b) y dos locales ($c y $d). Por tanto,
  23. #$a y $b solo serán reconocidas dentro de la función "numeros" y no en las funciones "suma" y "suma2".
  24. #Las variables $c y $d por ser locales, sí serán reconocidas en las funciones "suma" y "suma2".
  25. #Además en la función "suma" definimos otra variable local, ($suma) y en la funcion "suma2" definimos
  26. #una restringida ($suma2). Como consecuencia de todo esto, la función "suma" solo reconoce las
  27. #variables $c y $d, y éstas serán las que sume siendo el resultado 1500. Podríamos pensar que en la
  28. #función "suma2" pasa lo mismo y debería devolvernos de nuevo el valor 1500. No ocurre de este modo
  29. #pues en "numeros" imprimos el valor de $suma2 que está restringida a la función "suma2", y,
  30. #en consecuencia no será reconocida en "numeros".
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
alexclipse
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2012-03-27 11:17 @511

Publicidad

Re: my y local

Notapor explorer » 2012-04-22 14:53 @661

¿Te has dado cuenta de que en el ejemplo no estás llamando a la función suma2()?

Tienes explicada la diferencia entre my() y local() en perldoc perlsub, en las secciones Private Variables via my() y Temporary Values via local().

La diferencia es que, mientras que con my() declaras variables locales al contexto en que te encuentras, local() define valores temporales a variables globales (variables pertenecientes al ámbito del package).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: my y local

Notapor alexclipse » 2012-04-22 15:01 @667

Sí, me he dado cuenta de que no llamo a suma2. Simplemente la defino para tener otra variable restringida y tener otro ejemplo.

Yo ya sé cuales son las locales y my(). Simplemente quiero saber si el ejemplo está más o menos bien explicado por qué no funciona como "debería" y por qué da el resultado que da.
alexclipse
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2012-03-27 11:17 @511

Re: my y local

Notapor explorer » 2012-04-22 16:58 @748

La explicación está mal desde el principio: local() no declara variables locales. Es my() quien lo hace. local() solo asigna valores temporales a variables que ya existen.

Para estar seguros, activa el modo 'strict' y 'warnings' y será el propio Perl el que te avisará si ve alguna cosa rara.

Si lo haces, Perl saca esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@portatil ~/Documentos/Desarrollo $ perl -c code_30744.pl
Global symbol "$c" requires explicit package name at code_30744.pl line 10.
Global symbol "$d" requires explicit package name at code_30744.pl line 11.
Global symbol "$suma2" requires explicit package name at code_30744.pl line 15.
Global symbol "$suma" requires explicit package name at code_30744.pl line 19.
Global symbol "$c" requires explicit package name at code_30744.pl line 19.
Global symbol "$d" requires explicit package name at code_30744.pl line 19.
Global symbol "$suma" requires explicit package name at code_30744.pl line 21.
Global symbol "$c" requires explicit package name at code_30744.pl line 25.
Global symbol "$d" requires explicit package name at code_30744.pl line 25.
code_30744.pl had compilation errors.
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Y ya ves algo curioso: te dice que $c, en la línea 10, es una variable que necesita, obligatoriamente, que esté definida en algún paquete. O lo que es lo mismo: no sabe dónde está definida, y por eso lo marca como error.

Eso es porque local() necesita que $c ya esté definida en otro lugar, como variable global. No la va a crear, sino que le va a dar un valor temporal (500, en el código), recuperando el valor anterior cuando se termine el contexto en donde está.

Otra cosa es que lo ejecutes sin 'strict'. Entonces, "parece" que funciona, pero es porque Perl, en modo no estricto, autovivifica las variables globales (las crea de la nada) en cuanto son mencionadas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 26 invitados