[РЕДАКТИРОВАТЬ: В моем предыдущем решении, включающем use Lots::Of::Modules;
, была небольшая ошибка - см. Ниже. Исправление делает все немного уродливым, но все же работоспособным.]
[РЕДАКТИРОВАТЬ # 2: Добавлено BEGIN { ... }
вокруг кода, чтобы гарантировать, что любые определенные функции доступны во время компиляции. Спасибо jrockway за указание на это.]
Следующий код будет делать то же, что и код jrockway, только проще и понятнее:
In 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;
вызывается более одного раза, например, в отдельных модулях use
d основная программа). Более примитивный do
не генерирует исключение, если ему не удается найти файл, названный его аргументом в @INC
, следовательно, необходимо проверить результат с помощью defined
.