- Podemos hacer que al declarar las variables en BEGIN, ya que estamos, le agreguemos un default.
BEGIN {Solo hay que cambiar un poco el corazón de todo esto:
var "espia" => "James Bond";
var "jefe" => "M5";
var "familia_que_ignora_la_verdad" => "No tiene";
}
# 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 {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.
var "nombre" => "NN", validate => { $_[0] !~ /admin|root/i };
bool "es_jefe" => "true", validate => { ... };
int "edad" => 1, max => 18;
}
Saludos!
-- Diego.