1 #!/usr/bin/perl -w -I. 2 use Inspector; 3 4 $x = 10; 5 Inspector->scalar($x, 1); 6 $x = 20; 7 Inspector->debug($x,0); 8 $x = 30; 9 $x += 5; 10 Inspector->debug($x,1); 11 $x += 10;al ejecutarse da como resultado:
~/perl/src> use_Inspector.pl val=20 use_Inspector.pl:6:main val=45 use_Inspector.pl:11:mainLa idea es que una llamada a
Inspector->scalar($x, 1)
ata la variable $x
(que será su argumento $_[1]
) a la clase Inspector
(argumento $_[0]
).
El tercer argumento lógico, indica si queremos activar o desactivar la depuración de la
variable. Una vez atada, podemos usar el método Inspector->debug
para
controlar el rastreo de la variable.
package Inspector; sub TIESCALAR { my ($class, $val, $debug) = @_; bless { val => $val, debug => $debug }, $class; } sub FETCH { my $impl = shift; return $impl->{val}; } sub STORE { my ($implementation, $newval) = @_; $implementation->{val} = $newval; if ($implementation->{debug}) { my ($cur_pkg, $cur_file, $cur_line) = caller; print STDERR "val=$implementation->{val} $cur_file:$cur_line:$cur_pkg\n"; } } sub scalar { my ($class, $var, $debug) = @_; tie $_[1], $class, $_[1], $debug; } sub debug { my $impl = tied($_[1]); my $deb = $_[2]; $impl->{debug} = $deb; } 1;La llamada a
Inspector->scalar($x, 1)
conlleva a través de tie
una llamada
a la función TIESCALAR
que es la que construye el ''hash'' anónimo.
La entrada val
guarda el valor de la variable.
La entrada debug
indica si los valores de la variable deben o no ser
volcados a STDERR
cuando se cambia su valor. Por último TIESCALAR
bendice el ''hash'' y devuelve su referencia como el objeto que
reimplementa a la variable original.
Toda modificación de la variable se hace a través de STORE
, la cuál
después de cumplir con la reglamentaria asignación imprime los valores
por STDERR
si es el caso.
Puesto que no hemos provisto de métodos de acceso a la implementación interna
de la variable hemos tenido que usar la función tied . Esta función
recibe una variable como argumento y, si esta ''atada'' a un objeto
devuelve una referencia al objeto. En otro caso devuelve undef
.
Asi pues, debug
llama primero a tied
y después establece
el valor de la entrada debug
del ''hash''.
Casiano Rodríguez León