Analogamente al modo in cui è possibile utilizzare AUTOLOAD
per definire subroutine su richiesta, mi chiedo se esiste un modo per legare lo stash di un pacchetto in modo da poter intercettare l'accesso alle variabili in quel pacchetto.In Perl, c'è un modo per legare una scorta?
Ho provato varie permutazioni della seguente idea, ma nessuno sembra funzionare:
{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;
Questo muore con Bad symbol for scalar ...
sull'ultima riga, senza mai la stampa "calling fetch"
. Se viene rimossa la riga , il programma viene eseguito ed esce correttamente.
La mia ipotesi è che l'errore abbia a che fare con lo stash, ma non lo stesso di hash, quindi il meccanismo di collegamento standard non funziona correttamente (o potrebbe semplicemente essere che la ricerca di stash non invoca mai il tie magia).
Qualcuno sa se questo è possibile? Pure Perl sarebbe la cosa migliore, ma le soluzioni XS sono ok.
Funziona se si prende la chiamata 'tie ...' dal blocco 'BEGIN'? – mob
Se si fa il legame più tardi, perl è già stato e andato a cercare il glob che contiene $ Target :: x, quindi non succede niente. Prova a eseguire perl -M0 = Terse foo.pl per vedere perché. – Alex