Подобно тому, как 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;
Это умирает с неверным символом для скаляра .. .
в последней строке, без вывода «вызывающая выборка»
. Если строка say $ Target :: x;
удаляется, программа запускается и завершается правильно.
Я предполагаю, что сбой связан с тем, что тайники похожи, но не идентичны хешам, поэтому стандартный механизм связывания не работает должным образом (или может быть просто поиск тайника никогда не вызывает магию связывания).
Кто-нибудь знает, возможно ли это? Чистый Perl был бы лучше, но решения XS подойдут.