domingo, 25 de mayo de 2014

Cómo sacar algunos sigils ($@%&), parte 1

Estuve jugando a sacarle los sigils (los símbolos que indican si las variables son strings, listas o hashes (diccionarios en python))

Lo primero que podemos hacer es definir de antemano una función con un prototipo ";$", que quiere decir que la función recibe como argumento un escalar, opcionalmente. Osea, que se puede ejecutar "boo" o "boo($persona)".
#!/usr/bin/perl
use strict;
use warnings;

sub boo(;$) {
     print "Boo!";
}
Luego, para ejecutarlo, solo tenemos que llamar a la función, sin siquiera paréntesis:
#!/usr/bin/perl
use strict;
use warnings;

sub boo(;$) {
     print "Boo!";
}
boo;
Y eso nos imprime por pantalla "Boo!", como se espera.  Hagamos una mejora: si uno le da un argumento a "boo", entonces que lo guarde; si no, que lo devuelva.
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;

sub boo(;$) {
        state $susto = "Default Boo";
        if ( $_[0] ) { $susto = $_[0]; }
        return $susto;
}

say "En la oscuridad, llego a la esquina y... " . boo . "!";
boo "Cuidado";
say "En la oscuridad, llego a la esquina y... " . boo . "!";
Ahora tiene un poco más de pinta de variable sin sigil. Pero ¡pidamos más! ¿Podremos asignar un valor a "boo" con un igual, como en (casi) cualquier lenguaje de programación? Por supuesto! Si le ponemos el atributo "lvalue" a boo.
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;

sub boo(;$) :lvalue {
        state $susto = "Default Boo";
        if ( $_[0] ) { $susto = $_[0]; }
        return $susto;
}

say "En la oscuridad, llego a la esquina y... " . boo . "!";
boo "Cuidado";
say "En la oscuridad, llego a la esquina y... " . boo . "!";
boo = "AAAAAAAAAAH!";
say "En la oscuridad, llego a la esquina y... " . boo . "!";


Sigo con un intento, por ahora fallido, de hacer esto aún más general, en la segunda parte.

 -- Diego.

No hay comentarios:

Publicar un comentario