[EDIT: Мое предыдущее решение с использованием use Lots::Of::Modules; имело небольшую ошибку — см. внизу. Это исправление делает вещи немного уродливее, но все еще работает.]
[EDIT #2: Добавлено BEGIN { ... } вокруг кода, чтобы гарантировать, что любые определенные функции доступны во время компиляции. Спасибо jrockway за указание на это.]
Следующий код будет делать то же самое, что и код jrockway, только проще и понятнее:
В Lots/Of/Modules.inc:
use Carp qw/confess cluck/;
use Path::Class qw/file dir/;
0; # Flag an error if called with "use" or "require" instead of "do"
Чтобы импортировать эти 4 функции:
BEGIN { defined( do 'Lots/Of/Modules.inc' ) or die; }
Поскольку в начале этого файла нет оператора package Lots::Of::Modules;, операторы use будут экспортированы в пакет вызывающего объекта.
Мы должны использовать do вместо use или require, так как последний загрузит файл только один раз (что приведет к сбою, если use Lots::Of::Modules; вызывается более одного раза, например, в отдельных модулях used основной программой). Более примитивный do не генерирует исключение, если ему не удается найти файл, названный его аргументом в @INC, поэтому необходимо проверить результат с помощью defined.
person
j_random_hacker
schedule
14.01.2009