我应该如何组织许多Perl模块?

时间:2010-05-07 12:59:22

标签: perl perl-module

考虑到我在12个目录中有100个Perl模块。但是,查看主要的Perl脚本,它看起来像100 use p1 ; use p2 ;等。解决此问题的最佳方法是什么?

4 个答案:

答案 0 :(得分:8)

我似乎不太可能直接在主程序中use所有100个模块。如果您的程序使用模块A中的函数然后从模块B调用函数,但主程序本身不引用模块B中的任何内容,则程序应仅use A。它不应该use B,除非它直接调用模块B中的任何内容。

另一方面,如果你的主程序确实直接与所有100个模块对话,那么它可能只是太大了。确定程序中的不同功能分组,并将每个组分解为自己的模块。这样做的主要原因是它将使代码更易于维护,更灵活,更可重用,但它也会产生令人愉快的副作用,即减少主程序直接与之对话的模块数量,从而减少减少任何一个地方所需的use语句数量。

(而且,是的,我确实意识到100可能是夸大其词,但是,如果您对代码中的use模块数量感到不安,那么这通常表明有问题的代码试图在一个地方做太多,应该分解成一组模块。)

答案 1 :(得分:4)

将所有use语句放在一个文件中,比如Mods.pm:

package Mods;

use Mod1;
use Mod2;
...

并在主脚本中包含该文件:

use Mods;

答案 2 :(得分:2)

我支持eugene的解决方案,但您可以按主题将use语句分组到文件中,例如:

package Math;

use ModMatrix;
use ModFourier;
...

当然,您应该将模块和mod集合命名为有意义。

答案 3 :(得分:1)

将所有使用语句放在单独的文件中作为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 $@;  # 'use' means "require pkg; pkg->import()" 
    $_->import();                 # at compile time
}

our @EXPORT = grep {*{$Mods::{$_}}{CODE}} keys %Mods::; # grab imported subs
#or @EXPORT_OK