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)

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19