Perl:如何在许多独立脚本之间共享大量模块的导入?

Wil*_*lem 7 perl module

我有很多独立的脚本.他们唯一共享的是,他们使用()一大组CPAN模块(每个模块都导出几个函数).我想集中这个模块列表.我发现了几种方法.哪一个是最好的?

  1. 我可以创建SharedModules.pm来导入所有内容,然后使用Exporter手动将所有内容导出到main ::.

  2. 我可以创建以"package main"开头的SharedModules.pm 所以它会直接导入main ::.它似乎工作.这是不好的做法,为什么?

  3. 我可以要求()一个似乎将所有内容导入main ::的sharedmodules.pl.我不喜欢这种方法,因为在mod_perl下,require()不能很好地工作.

第二个看起来对我来说最好,但是我想知道为什么例如Modern :: Perl不能那样工作.

编辑:我认为之前已经问过这个问题.

bvr*_*bvr 6

将所有内容放入main命名空间可能比将其导入调用者的命名空间更灵活.像这样的东西:

package SharedModules;

sub import {

    my $pkg = (caller())[0];
    eval <<"EOD";

package $pkg;

use List::Util;
use List::MoreUtils;

EOD

    die $@ if $@;
}

1;
Run Code Online (Sandbox Code Playgroud)


Dav*_*man 4

您提出的所有三个解决方案的问题在于该模块可能是use从另一个模块中导出的,在这种情况下,符号应该导出到useing 模块的包中,而不是导出到main.

bvr 的解决方案是使用caller将内容直接导入到该包中,这是朝着正确方向迈出的重要一步,但阻止了“真实”包使用use ShareableModules qw( foo bar baz);选择性地仅导入其实际需要的内容。

不幸的是,保留选择性导入的能力将要求您从底层模块导入所有相关符号,然后从 ShareableModules 重新导出它们。您不能将导入委托给每个底层模块的import方法(就像这样Modern::Perl做),因为import如果要求提供该模块未导出的符号,则会死亡。不过,如果这不是问题,那么 的Modern::Perl做法可能是最干净、最简单的选择。