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.
Czy to działa, jeśli wykonasz wywołanie 'tie ...' z bloku 'BEGIN'? – mob
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