Позволяет ли Perl monkey-patching видеть область пропатченного пакета? - PullRequest
3 голосов
/ 24 января 2009

Я обезьяна исправляю пакет, используя методику, приведенную в начале «Как я могу обезопасить метод экземпляра в Perl?» . Проблема, с которой я сталкиваюсь, заключается в том, что исходная подпрограмма использовала переменную уровня пакета my, к которой у запатентованной подпрограммы, по-видимому, нет доступа ни по спецификации полного пути, ни по скрытому использованию.

Есть ли способ получить данные, ограниченные таким образом, для использования в исправленной подпрограмме?

Ответы [ 3 ]

7 голосов
/ 24 января 2009

Вы можете получить лексику с помощью модуля PadWalker . Зло, но это работает.

5 голосов
/ 24 января 2009

Нет. В чем вы ошибаетесь, так это в том, что они , а не в области действия пакета. Лексическая переменная по определению ограничена своей лексической областью, другими словами, блоком, в котором она находится.

0 голосов
/ 29 января 2009

Лексические выражения (т. Е. Объявленные с помощью «my») не видны за пределами лексической области (файла или блока), в которой они объявлены. В этом весь смысл лексических переменных.

Если есть подпрограмма / метод, который находится в той же области видимости, что и лексическая переменная, он может вернуть значение лексической переменной и разрешить косвенный доступ к переменной вне его области.

Для лексических переменных не существует такого понятия, как «полный путь». Это для переменных пакета. Если бы переменная была объявлена ​​с «нашим» вместо «моего», вы могли бы сделать это.

...