Как мне организовать много модулей Perl? - PullRequest
10 голосов
/ 07 мая 2010

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

Ответы [ 4 ]

8 голосов
/ 07 мая 2010

Мне кажется маловероятным, что вы use используете все 100 модулей непосредственно в своей основной программе. Если ваша программа использует функцию в модуле A, которая затем вызывает функцию из модуля B, но основная программа сама не ссылается на что-либо в модуле B, то программа должна только use A. Он не должен use B, если он напрямую не вызывает что-либо из модуля B.

Если, с другой стороны, ваша основная программа действительно общается напрямую со всеми 100 модулями, то она, вероятно, слишком большая. Определите различные функциональные группы в программе и разбейте каждую из этих групп на отдельный модуль. Основная причина для этого состоит в том, что это приведет к тому, что код станет более понятным, гибким и пригодным для повторного использования, но он также будет иметь счастливый побочный эффект, заключающийся в сокращении количества модулей, с которыми основная программа обращается напрямую, таким образом сокращая на количество use заявлений, необходимых в любом месте.

(И, да, я понимаю, что 100, вероятно, было преувеличением, но, если вам становится неудобно из-за количества модулей, которые use d в вашем коде, то это, как правило, убедительный признак того, что код в Вопрос заключается в том, чтобы сделать слишком много в одном месте и разбить его на набор модулей.)

4 голосов
/ 07 мая 2010

Поместите все операторы use в один файл, скажем, Mods.pm:

package Mods;

use Mod1;
use Mod2;
...

и включите файл в ваш основной скрипт:

use Mods;
2 голосов
/ 07 мая 2010

Я поддерживаю решение Евгения, но вы можете сгруппировать операторы use в файлах по темам, например:

package Math;

use ModMatrix;
use ModFourier;
...

И, конечно, вы должны назвать модули и коллекции модов значимыми.

1 голос
/ 07 мая 2010

Поместить все операторы использования в отдельный файл, как предложил Евгений, вероятно, лучший подход. вы можете свести к минимуму набор текста в этом модуле с небольшим количеством метапрограммирования:

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
...