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
