Domanda

Simile al modo AUTOLOAD può essere utilizzato per definire subroutine su richiesta, mi chiedo se c'è un modo per legare scorta di un pacchetto in modo che possa intercettare l'accesso alle variabili in quel pacchetto.

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;  

Questa stampi con Bad symbol for scalar ... sull'ultima riga, senza mai la stampa "calling fetch". Se la linea say $Target::x; viene rimossa, il programma viene eseguito e le uscite in modo corretto.

La mia ipotesi è che il fallimento ha a che fare con stashes essere come, ma non lo stesso hash, in modo che il meccanismo di legame di serie non funziona correttamente (o potrebbe essere solo che scorta di ricerca non invoca la magia cravatta).

Qualcuno sa se questo è possibile? Pure Perl sarebbe meglio, ma le soluzioni XS sono ok.

È stato utile?

Soluzione

Si sta colpendo un errore interno momento della compilazione ( "Bad simbolo per scalare"), questo accade mentre Perl sta cercando di capire cosa '$ target :: x' dovrebbe essere, che si può verificare eseguendo un debug Perl con:

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

Credo che il GV per ':: target' è sostituito da qualcosa di diverso quando si legano (), in modo che tutto ciò che alla fine cerca di raggiungere il suo hash interna non può. Dato che tie () è un po 'di confusione, ho il sospetto che quello che stai cercando di fare non funziona, che è suggerita anche da questo (vecchio) serie di scambi su P5P:

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

Altri suggerimenti

Un po 'tardi per la domanda, ma anche se non è possibile utilizzare cravatta per fare questo, variabile :: Magia consente di collegare la magia per una scorta e, quindi, ottenere qualcosa di simile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top