Позволяет ли Perl-обезьянье исправление увидеть область действия исправленного пакета?
-
19-08-2019 - |
Вопрос
Я как обезьяна исправляю пакет, используя технику, описанную в начале «Как я могу исправить метод экземпляра в Perl?».Проблема, с которой я столкнулся, заключается в том, что исходная подпрограмма использовала функцию уровня пакета. my
переменная, к которой исправленная подпрограмма не имеет доступа ни при указании полного пути, ни при неявном использовании.
Есть ли способ получить данные, ограниченные таким образом, для использования в исправленной подпрограмме?
Решение
Вы можете получить лексику с помощью модуля PadWalker . Зло, но это работает.
Другие советы
Нет.Вы ошибаетесь в том, что они нет область действия пакета.Лексическая переменная по определению ограничена своей лексической областью действия, другими словами, блоком, в котором она находится.
Лексики (т.е.:объявленные с помощью «my») не видны за пределами лексической области видимости (файла или блока), в которой они объявлены.В этом вся суть лексических переменных.
Если существует подпрограмма/метод, который находится в той же области видимости, что и лексическая переменная, то она может вернуть значение лексической переменной и разрешить косвенный доступ к переменной из-за пределов ее области действия.
Для лексических переменных не существует такой вещи, как «полная спецификация пути».Это для переменных пакета.Если бы переменная была объявлена с «нашим» вместо «моего», вы могли бы это сделать.