Учтите, что у меня есть 100 модулей Perl в 12 каталогах. Но, глядя в главный Perl script, он выглядит как 100 use p1 ; use p2 ;
и т.д. Каков наилучший способ решить эту проблему?
Как мне организовать много модулей Perl?
Ответ 1
Мне кажется маловероятным, что вы use
задействуете все 100 модулей непосредственно в своей основной программе. Если ваша программа использует функцию в модуле A, которая затем вызывает функцию из модуля B, но сама основная программа не ссылается ни на что в модуле B, тогда программа должна только use A
. Он не должен use B
, если он напрямую не называет ничего из модуля B.
Если, с другой стороны, ваша основная программа действительно разговаривает напрямую со всеми 100 модулями, то она, вероятно, просто слишком большая. Определите различные функциональные группы в программе и разбейте каждую из этих групп на свой собственный модуль. Основная причина для этого заключается в том, что это приведет к тому, что код будет более удобным, гибким и многоразовым, но он также будет иметь счастливый побочный эффект для сокращения количества модулей, к которым напрямую обращается основная программа, вниз по числу операторов use
, требуемых в любом месте.
(И да, я понимаю, что 100, вероятно, было преувеличением, но если вам становится неудобно о том, что количество модулей use
d по вашему коду, то это обычно указывает на то, что код в вопрос пытается сделать слишком много в одном месте и должен быть разбит на набор модулей.)
Ответ 2
Поместите все операторы use
в один файл, скажем Mods.pm:
package Mods;
use Mod1;
use Mod2;
...
и включите файл в свой основной script:
use Mods;
Ответ 3
Я поддерживаю решение eugene, но вы можете группировать операторы use
в файлах по темам, например:
package Math;
use ModMatrix;
use ModFourier;
...
И, конечно же, вы должны назвать модули и коллекции мод значимыми.
Ответ 4
Включение всех инструкций использования в отдельный файл, поскольку предложенный eugene, вероятно, лучший подход. вы можете свести к минимуму ввод текста в этом модуле с небольшим метапрограммированием:
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 [email protected]; # 'use' means "require pkg; pkg->import()"
$_->import(); # at compile time
}
our @EXPORT = grep {*{$Mods::{$_}}{CODE}} keys %Mods::; # grab imported subs
#or @EXPORT_OK