Monday, August 31, 2009

Perl: как определить, из какого модуля импортирована функция

Как известно, при загрузке модуля с помощью use может происходить автоматический импорт функций или переменных в текущее пространство имен. Я не буду сейчас судить, насколько это хорошая практика программирования, но иногда требуется определить, из какого модуля импортирована функция.

В этом нам поможет модуль Devel::Peek. Делаем дамп ссылки на интересующую функцию и смотрим параметр GVGV::GV:

$ perl -MEncode -MDevel::Peek -e 'Dump &encode'
...
GVGV::GV = 0x284a9d48 "Encode" :: "encode"
...
В качестве альтернативы можно использовать Sub::Identify.

Если нет возможности установить эти модули, можно использовать такой подход: последовательно добавляем () ко всем выражениям use Module, пока не получим ошибку "Undefined subroutine ...".

Кстати, интересно, почему в пропиареную Perl Best Practices не включена хорошая практика: всегда использовать синтаксис use Module LIST вместо use Module, явно перечисляя имена импортируемых функций.

No comments:

Post a Comment