Similar a la forma en que AUTOLOAD
se puede usar para definir subrutinas bajo demanda, me pregunto si hay una manera de vincular el alijo de un paquete para que pueda interceptar el acceso a las variables en ese paquete.En Perl, ¿hay alguna forma de atar un alijo?
He intentado varias permutaciones de la siguiente idea, pero ninguno parece funcionar:
{package Tie::Stash;
use Tie::Hash;
BEGIN {our @ISA = 'Tie::StdHash'}
sub FETCH {
print "calling fetch\n";
}
}
{package Target}
BEGIN {tie %Target::, 'Tie::Stash'}
say $Target::x;
Esta muere con Bad symbol for scalar ...
en la última línea, sin tener que imprimir "calling fetch"
. Si se elimina la línea say $Target::x;
, el programa se ejecuta y sale correctamente.
Supongo que la falla tiene que ver con que los depósitos son similares, pero no lo mismo que los hash, por lo que el mecanismo de enlace estándar no funciona bien (o puede ser que la búsqueda oculta nunca invoque magia de enlace).
¿Alguien sabe si esto es posible? Pure Perl sería lo mejor, pero las soluciones XS están bien.
¿Funciona si tomas la llamada 'tie ...' del bloque 'BEGIN'? – mob
Si haces el empate más tarde, perl ya ha estado y se fue a buscar el comodín que tiene $ Target :: x, así que no pasa nada. Intenta ejecutar perl -M0 = Termine foo.pl para ver por qué. – Alex