Как мне организовать много модулей Perl?

Учтите, что у меня есть 100 модулей Perl в 12 каталогах. Но, глядя в главный Perl script, он выглядит как 100 use p1 ; use p2 ; и т.д. Каков наилучший способ решить эту проблему?

Ответ 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