Se puede obtener una información mas detallada sobre el contexto de la llamada usando el módulo Contextual::Return :
pl@nereida:~/src/perl/testing$ cat contextual.pl
#!/usr/local/bin/perl -w
use strict;
use Contextual::Return;
sub sensible {
return STR { "one" }
NUM { 1 }
;
}
print "Result = ".sensible()."\n";
print "Result = ".(0+sensible())."\n";
Al ejecutar este programa obtenemos:
pl@nereida:~/src/perl/testing$ contextual.pl Result = one Result = 1
Contextual::Return tambien permite crear variables contextuales multitipo con mas de dos tipos (a diferencia de dualvar que está restringida a los tipos cadena y número):
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
