我正在使用带有apache的perl构建内部自动化/ Web工具。它托管在Windows环境中。我的问题是在处理所有具有共同模块的许多页面时。而不是为每个页面手动添加每个模块,是否可以在所有可用于页面的模块中提取“全局模块”?
例如,如果我需要添加一个新模块并且有10个页面,而不是进入每个页面并添加使用New :: Package;是否可以在1个配置文件中执行此操作,以使New :: Package可用于使用此配置模块的每个文件?
我已经使用PHP完成了这项工作,您可以在某些init脚本中包含/ require,然后在每个页面上包含该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很新,所以如果这是显而易见的事情,那就去吧:)
答案 0 :(得分: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"
。