2011-04-27 8 views
8

Podobny do sposobu, w jaki można zdefiniować podprogramy na żądanie, zastanawiam się, czy istnieje sposób na powiązanie skrytki pakietu, aby móc przechwycić dostęp do zmiennych w tym pakiecie.W Perlu, czy istnieje sposób na powiązanie ze skrytką?

Próbowałem różne permutacje następujący pomysł, ale nie wydają się działać:

{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; 

umiera ten z Bad symbol for scalar ... na ostatniej linii, nigdy drukowania "calling fetch". Jeśli linia say $Target::x; zostanie usunięta, program uruchomi się i zakończy poprawnie.

Domyślam się, że błąd związany jest ze skąpakami, ale nie takimi samymi jak hasze, więc standardowy mechanizm łączenia nie działa poprawnie (lub może być tak, że wyszukiwanie nie wywołuje magii wiązania).

Czy ktoś wie, czy jest to możliwe? Pure Perl byłby najlepszy, ale rozwiązania XS są w porządku.

+0

Czy to działa, jeśli wykonasz wywołanie 'tie ...' z bloku 'BEGIN'? – mob

+0

Jeśli wykonasz remis później, perl już był i nie szuka globu, który ma $ Target :: x, więc nic się nie dzieje. Spróbuj uruchomić perl -M0 = Terse foo.pl, aby zobaczyć, dlaczego. – Alex

Odpowiedz

4

Występuje błąd wewnętrzny czasu kompilacji ("Zły symbol dla skalaru"), dzieje się tak, gdy Perl próbuje ustalić, jaki powinien być "docelowy: $ x", który można zweryfikować, uruchamiając debugowanie Perl z:

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

myślę GV dla „:: TARGET” zastępuje się czegoś innego po tie(), więc, że cokolwiek w końcu próbuje dostać się do jego wewnętrznej hash nie może. Biorąc pod uwagę, że tie() jest trochę bałaganu, podejrzewam, co próbujesz robić nie będzie działać, co przemawia także to (stary) Zestaw wymiany na P5P:

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

1

Trochę za późno na to pytanie, ale chociaż nie można tego użyć, Variable :: Magic pozwala przypisać magię do skrytki i tym samym osiągnąć coś podobnego.

Powiązane problemy