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

问题描述 投票:0回答:5

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

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

  2. 我可以创建以“package main;”开头的 SharedModules.pm所以它将直接导入到 main:: 中。似乎有效。这是不好的做法吗?为什么?

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

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

编辑:我认为这个问题已经被问过

perl module
5个回答
6
投票

也许比将所有内容放入

main
命名空间更灵活的是导入调用者的命名空间。像这样的东西:

package SharedModules;

sub import {

    my $pkg = (caller())[0];   # name of calling package
    eval <<"EOD";

package $pkg;                  # select target package

# list of packages to import
use List::Util;
use List::MoreUtils;

EOD
    # import function continues here
    die $@ if $@;             # check for errors, print them, and exit
}

1;

4
投票

您提出的所有三个解决方案的问题在于,该模块可能是从另一个模块

use
d而来的,在这种情况下,符号应该导出到
use
ing模块的包中,而不是导出到
main
中。

bvr 使用

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

不幸的是,保留选择性导入的能力将要求您从底层模块导入所有相关符号,然后从 ShareableModules 重新导出它们。您不能将导入委托给每个底层模块的

import
方法(如
Modern::Perl
所做的那样),因为如果
import
需要一个未由该模块导出的符号,那么它就会死亡。不过,如果这不是问题,那么
Modern::Perl
的做法可能是最干净、最简单的选择。


2
投票

使用

require
是最自然的方法。在 mod_perl 下,您可能需要在服务器启动期间修改
@INC


2
投票

也许您想要工具包


1
投票

文件导入.pl:

require blah;  blah->import;
require blubb; blubb->import;

脚本:

#!/usr/bin/perl
do 'import.pl'
...

帕特里克

© www.soinside.com 2019 - 2024. All rights reserved.