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