Pregunta

Similar al camino AUTOLOAD Se puede usar para definir subrutinas a pedido, me pregunto si hay una manera de atar el alijo de un paquete para poder interceptar el acceso a variables en ese paquete.

He probado varias permutaciones de la siguiente idea, pero ninguna 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;  

Esto muere con Bad symbol for scalar ... en la última línea, sin imprimir nunca "calling fetch". Si el say $Target::x; La línea se elimina, el programa se ejecuta y sale correctamente.

Supongo que el fracaso tiene que ver con que los alojados son como, pero no lo mismo que los hashes, por lo que el mecanismo de corbata estándar no funciona bien (o podría ser que la búsqueda de altas nunca invoca magia de Tie).

¿Alguien sabe si esto es posible? Pure Perl sería mejor, pero las soluciones XS están bien.

¿Fue útil?

Solución

Estás presionando un error interno de tiempo de compilación ("Mal símbolo para escalar"), esto sucede mientras Perl está tratando de calcular qué debería ser '$ Target :: x', que puedes verificar ejecutando una depuración de Perl con:

perl -DT foo.pl
...
### 14:LEX_NORMAL/XOPERATOR ";\n"
### Pending identifier '$Target::x'
Bad symbol for scalar at foo.pl line 14.

Creo que el GV para ':: Target' se reemplaza por algo más cuando lo ates (), por lo que lo que eventualmente trata de llegar a su hash interno no puede. Dado que Tie () es un poco desordenado, sospecho que lo que está tratando de hacer no funcionará, lo que también es sugerido por este conjunto (antiguo) de intercambios en P5P:

https://groups.google.com/group/perl.perl5.porters/browse_thread/thread/f93da6bde02a91c0/ba43854e3c59a744??hl=en&ie=utf-8&q=perl+tie+stash#ba43854e3c59a744

Otros consejos

Un poco tarde a la pregunta, pero aunque no es posible usar TIE para hacer esto, Variable :: Magic te permite adjuntar magia a un alijo y, por lo tanto, lograr algo similar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top