Variables Mágicas

La Variable $!

Otro ejemplo de sensibilidad a este tipo de contexto lo da la variable escalar especial $!. En Perl existen variables ``mágicas'' o especiales que tienen este tipo de extraños nombres. Son mágicas porque, en la mayoría de los casos, se actualizan como consecuencia de algún efecto lateral. En un contexto numérico, la variable escalar $! retorna el valor numérico de la variable del sistema errno, la cual contiene el último error encontrado durante una llamada al sistema o a ciertas funciones de la biblioteca estándar C. En un contexto de cadena devuelve la cadena producida por la función perror():

lhp@nereida:~/etc$ perl -wde 0
main::(-e:1):   0
  DB<1> open $FILE, "fichero"
  DB<2> print "$!"
No existe el fichero o el directorio
  DB<3> print $!+0
2
  DB<4> print $!
No existe el fichero o el directorio
La función open intenta abrir para lectura el fichero con nombre fichero para dejar una descripción del mismo en la variable $FILE. En el supuesto de que tal fichero no exista, se producirán los correspondientes mensajes de error almacenados en $!.

Creando Variables Sensibles al Contexto

Es muy sencillo crear variables con una conducta sensible al contexto (numérico o de cadena) usando la función dualvar de Scalar::Util. Observe la siguiente sesión con el depurador:

pl@nereida:~/doc/casiano/PLBOOK/PLBOOK$ perl -wde 0
main::(-e:1):   0
  DB<1> use Scalar::Util qw{dualvar} # Importamos 'dualvar' del módulo Scalar::Util
  DB<2> use Lingua::EN::Words2Nums   # Importamos el módulo Lingua::EN::Words2Nums
  DB<3> $x = "one thousand two hundred thirty one" # ¿Que tal anda nuestro inglés?
  DB<4> $x = dualvar words2nums($x), $x # Creamos una variable dual
  DB<5> print "$x plus one is ".($x+1)  # Observe la salida ...
one thousand two hundred thirty one plus one is 1232
  DB<6> use Roman                    # Otro ejemplo ...
  DB<7> $y = 457
  DB<8> $y = dualvar $y, roman($y)
  DB<9> p 0+$y." en números romanos es '$y'"
457 en números romanos es 'cdlvii'

Mas potente aún es Contextual::Return de Damian Conway, el cual permite crear variables contextuales multitipo con mas de dos tipos:

lhp@nereida:~/Lperl/src/testing$ cat -n context1.pl
 1  #!/usr/local/bin/perl -w
 2  use strict;
 3  use Contextual::Return;
 4
 5  my $x = BOOL { 0 } NUM { 3.14 } STR { "pi" };
 6
 7  unless ($x) { warn "¡El famoso número $x (".(0+$x).") pasa a ser falso!\n" } # executed!
lhp@nereida:~/Lperl/src/testing$ context1.pl
¡El famoso número pi (3.14) pasa a ser falso!

Si se usa la etiqueta ACTIVE el código de definición será ejecutado cada vez que la variable multiestado es evaluada. Por ejemplo:

lhp@nereida:~/Lperl/src/testing$ cat -n context2.pl
1  #!/usr/local/bin/perl -w
2  use strict;
3  use Contextual::Return;
4
5  my $now = ACTIVE NUM { time } STR { localtime };
6
7  print "Now: $now (".($now+0).")\n";
8  sleep(1);
9  print "Now: $now (".($now+0).")\n";

La ejecución del programa produce una salida como esta:

lhp@nereida:~/Lperl/src/testing$ context2.pl
Now: Sat Mar 15 11:45:58 2008 (1205581558)
Now: Sat Mar 15 11:45:59 2008 (1205581559)

La Variable $_

Probablemente la mas importante de estas variables mágicas es $_. La variable especial $_ es el argumento por defecto para un gran número de funciones, operadores y estructuras de control. Asi, por ejemplo:

print;
es lo mismo que
print $_;

Otro ejemplo: La función length devuelve la longitud en caracteres de la expresión que se le pasa como argumento. Si se omite la expresión usará la variable por defecto $_:

lhp@nereida:~/etc$ perl -wde 0
Loading DB routines from perl5db.pl version 1.28
main::(-e:1):   0
  DB<1> $_ = "Hello World!\n"
  DB<2> p length
13

Variables Predefinidas en Perl

Existe un gran número de variables predefinidas en Perl que gobiernan diferentes aspectos del comportamiento del intérprete. Las iremos introduciendo a lo largo del curso. Por ahora, para saber más sobre las variables mágicas lea la documentación en perlvar:

$ perldoc perlvar

Como se señala en dicha documentación el módulo English permite usar un seudónimo para cada variable mágica. Por ejemplo, el alias de $_ es $ARG:

lhp@nereida:~/etc$ perl -de 0
DB<1> use English
DB<2> $_ = 4
DB<3> p $ARG
4



Subsecciones
Casiano Rodríguez León
2009-10-04