我正在使用 perl 和 apache 构建一个内部自动化/web 工具。它托管在 Windows 环境中。我的问题是在处理许多具有通用模块的页面时。不是手动为每个页面添加每个模块,是否可以让“全局模块”拉入页面可用的所有模块?
例如,如果我需要添加一个新模块并且有 10 个页面,而不是进入每个页面并添加使用 New::Package;是否可以在 1 个配置文件中执行此操作,使 New::Package 可用于使用此配置模块的每个文件?
我用 PHP 做到了这一点,您在其中包含/需要一些初始化脚本,然后只需在每个页面上包含该初始化脚本。
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 的新手,所以如果这是显而易见的事情,请放轻松 :)
最佳答案
这根本不是一件显而易见的事情。 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"
。
关于windows - 如何让配置文件自动为所有页面添加 'global' 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18193396/