lunes, 26 de mayo de 2014

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

Algunas ideas que se me ocurrieron a partir de las dos entradas anteriores:

  • Podemos hacer que al declarar las variables en BEGIN, ya que estamos, le agreguemos un default.

BEGIN {
        var "espia" => "James Bond";
        var "jefe"    => "M5";
        var "familia_que_ignora_la_verdad"  => "No tiene";
}
Solo hay que cambiar un poco el corazón de todo esto:
# Esta es la subrutina que genera las demas.
sub var ($;$) {
        say "Creando $_[0]... Hecho!" if $debug;
        my $p = "main"; # El namespace esta fijo en "main". TODO.

        # Si la sub que queremos que exista se llamara "espia" esto de abajo
        # sería: *main::espia = sub ...
        # El segundo argumento, si hay, es el default de la "variable" / sub.
        no strict 'refs';
        *{"${p}::${_[0]}"} = sub (;$) :lvalue {
                state $internal = "**internal**";
                if ( $_[0] ) { $internal = $_[0]; }
                return $internal;
        };
        &{"${p}::${_[0]}"} = "$_[1]" if $_[1];
        use strict;
}


  • También podríamos poner otras opciones en las definiciones:

BEGIN {
        var "nombre" => "NN", validate => { $_[0] !~ /admin|root/i };
        var "jefe"    => "M5",     validate => { $_[0] != nombre };
        var "edad" => 1, max => 18;
}
  • También podríamos poner otros nombres en vez de var, con otros restrains:

BEGIN {
        var "nombre" => "NN", validate => { $_[0] !~ /admin|root/i };
        bool "es_jefe"    => "true",     validate => { ... };
        int "edad" => 1, max => 18;
}
 Ya estoy delirando, porque para eso debe haber varios módulos hechos por gente que sabe más que yo :) Pero este, "casero", tiene muy pocas líneas de código.

Saludos!
 -- Diego.





No hay comentarios:

Publicar un comentario