Подобно тому, как AUTOLOAD
может использоваться для определения подпрограмм по требованию, мне интересно, есть ли способ связать тайник пакета, чтобы я мог перехватить доступ к переменным в этом пакете.
Я пробовал различные варианты следующей идеи, но, похоже, ни одна из них не работает:
{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;
Умирает с Bad symbol for scalar ...
в последней строке, без печати "calling fetch"
. Если строка say $Target::x;
удалена, программа запускается и завершается правильно.
Я предполагаю, что ошибка связана с тем, что тайники похожи, но не совпадают с хешами, поэтому стандартный механизм связывания работает неправильно (или это может быть просто, что поиск в тайнике никогда не вызывает магию связи). *
Кто-нибудь знает, возможно ли это? Чистый Perl был бы лучшим, но решения XS в порядке.