4

我正在使用 perl 和 apache 构建一个内部自动化/网络工具。它托管在 Windows 环境中。我的问题是在处理许多都有公共模块的页面时。除了手动为每个页面添加每个模块,是否可以在页面可用的所有模块中引入“全局模块”?

例如,如果我需要添加一个新模块并且有 10 个页面,而不是进入每个页面并添加使用 New::Package; 是否可以在 1 个配置文件中执行此操作,这将使 New::Package 可用于使用此配置模块的每个文件?

我已经用 PHP 完成了这项工作,您可以在一些 init 脚本中包含/要求,然后在每个页面上简单地包含该 init 脚本。

Package MyProj::Configuration
use package1;
...
use package999;

# Main Page
use MyProj::Configuration;

# Now all modules are included in this page, without needing to add them manually

TLDR: 你可以让一个配置模块将多个模块/包导入只包含这个神奇配置模块的页面吗?

编辑:我想补充一点,我对 perl 还很陌生,所以如果这是一件显而易见的事情,那就放轻松:)

4

1 回答 1

4

这根本不是一件显而易见的事情。该Exporter模块提供了一个export_to_level可以帮助解决此问题的功能。通常,使用Exporter(即,使包成为 的子类Exporter)将符号导出到调用包中。该export_to_level方法可以将符号导出到堆栈跟踪更高的包中,这就是您要在此处执行的操作。这是一个概念验证:

首先是一些具有导出功能的模块:

# Module1.pm
package Module1;
use base 'Exporter';
our @EXPORT = ('foo');
sub foo { "FOO" }
1;

# Module2.pm
package Module2;
use base 'Exporter';
our @EXPORT_OK = ('bar');
sub bar { "BAR" }
1;

# Module3.pm
package Module3;
use base 'Exporter';
our @EXPORT_OK = ('baz');
our %EXPORT_TAGS = ('all' => [ 'baz' ]);
sub baz { "BAZ" }
1;

而不是不得不说

use Module1;
use Module2 'bar';
use Module3 ':all';
use Module4;         # some other module that doesn't need to export anything

在几十个脚本中的每一个中,你宁愿说

use Module1234;

所以这Module1234.pm可能是这样的:

package Module1234; # optional
use Module1;
use Module2;
use Module3;
use Module4;

# these commands could go inside an  import  method, too.
Module1->export_to_level(1, __PACKAGE__);
Module2->export_to_level(1, __PACKAGE__, 'bar');
Module3->export_to_level(1, __PACKAGE__, ':all');
1;

现在打电话

package MyPackage;
use Module1234;

在您的脚本中将加载其他四个模块并处理将所有所需功能导出到MyPackage包中,并且

use Module1234;
print foo(), bar(), baz();

足以产生输出"FOOBARBAZ"

于 2013-08-12T19:01:27.287 回答