10

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

4

4 回答 4

8

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

另一方面,如果您的主程序确实直接与所有 100 个模块对话,那么它可能只是太大了。识别程序中的不同功能分组,并将这些分组中的每一个分解成自己的模块。这样做的主要原因是这样可以使代码更易于维护、更灵活、更可重用,但它也有减少主程序直接对话的模块数量的副作用,从而减少减少use任何一个地方所需的报表数量。

(而且,是的,我确实意识到 100 可能有点夸张,但是,如果您对use代码中的模块数量感到不舒服,那么这通常强烈表明相关代码也在尝试这样做很多东西都集中在一个地方,应该分解成一组模块。)

于 2010-05-07T14:29:51.903 回答
4

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

package Mods;

use Mod1;
use Mod2;
...

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

use Mods;
于 2010-05-07T13:04:03.780 回答
2

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

package Math;

use ModMatrix;
use ModFourier;
...

当然,您应该将模块和 mod-collections 命名为有意义的。

于 2010-05-07T13:15:16.360 回答
1

按照 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
于 2010-05-07T14:53:58.880 回答