Полагайте, что у меня есть 100 модулей Perl в 12 каталогах. Но, изучая основной сценарий Perl, это похоже 100 use p1 ; use p2 ;
и т.д. Что к лучшему способу решить эту проблему?
Мне кажется маловероятным, что вы re используйте
все 100 модулей прямо в вашей основной программе. Если ваша программа использует функцию в модуле A, которая затем вызывает функцию из модуля B, но сама основная программа ни на что не ссылается в модуле B, тогда программа должна только использовать A
. Он не должен использовать B
, если он напрямую не вызывает что-либо из модуля B.
Если, с другой стороны, ваша основная программа действительно взаимодействует напрямую со всеми 100 модулями, то, вероятно, она просто слишком велика. Определите различные функциональные группы в программе и разбейте каждую из этих групп на отдельный модуль. Основная причина этого заключается в том, что это приведет к тому, что код станет более удобным в обслуживании, гибким и многоразовым, но он также будет иметь счастливый побочный эффект в виде уменьшения количества модулей, с которыми основная программа общается напрямую, что сокращает вниз по количеству операторов использования
, необходимых в любом месте.
(И, да, я понимаю, что 100, вероятно, было преувеличением, но, если вам неудобно, что количество модулей , используйте
d в вашем коде, то это обычно явный признак что рассматриваемый код пытается сделать слишком много в одном месте и должен быть разбит на набор модулей.)
Поместите все use
утверждения в один файл, скажем Mods.pm:
package Mods;
use Mod1;
use Mod2;
...
и включите файл в ваш основной скрипт:
use Mods;
Я поддерживаю решение Евгения, но вы можете сгруппировать операторы use
в файлах по темам, например:
package Math;
use ModMatrix;
use ModFourier;
...
И, конечно же, вы следует называть модули и коллекции модов осмысленными.
Размещение всех операторов use в отдельном файле, как предложил eugene y, вероятно, лучший подход. Вы можете минимизировать набор текста в этом модуле с помощью метапрограммирования:
package Mods;
require Exporter;
our @ISA = 'Exporter';
my @packages = qw/Mod1 Mod2 Mod3 .... /;
# or map {"Mod$_"} 1 .. 100 if your modules are actually named that way
for (@packages) {
eval "require $_" or die $@; # 'use' means "require pkg; pkg->import()"
$_->import(); # at compile time
}
our @EXPORT = grep {*{$Mods::{$_}}{CODE}} keys %Mods::; # grab imported subs
#or @EXPORT_OK