我想在Perl中做类似这样的事情:
$Module1="ReportHashFile1"; # ReportHashFile1.pm
$Module2="ReportHashFile2"; # ReportHashFile2.pm
if(Condition1)
{
use $Module1;
}
elsif(Condition2)
{
use $Module2;
}
报告散列文件 *.pm包含一个包报告散列文件 *。
还有如何根据动态模块名引用模块内的数组?
@Array= @$Module1::Array_inside_module;
有什么办法可以做到吗?某种编译指令?
4条答案
按热度按时间snz8szmq1#
您可能会发现
if
模块对此非常有用。否则,基本思想是使用
require
,它发生在运行时,而不是use
,它发生在编译时。对于全局变量的寻址,如果只导出变量或返回变量的函数给调用者,可能会更容易一些,可以使用它的非限定名称,否则也可以使用一个方法并以
$Module->method_name
的形式调用它。或者,您可以使用
perlref
中所述的符号引用,但是,这通常会让代码味道很重。4jb9z9bj2#
除非执行速度很重要,否则可以使用字符串eval:
polhcujo3#
人们已经告诉过你如何用Perl原语加载模块,还有Module::Load::Conditional。
如果你想访问一个同名的数组,不管你加载的是哪个模块,考虑为它创建一个方法,这样你就可以跳过符号引用的东西,给予每个模块一个同名的方法:
然后,在加载该模块时:
2023 update最近我一直在
state
表达式中使用require
,因为它在作用域中只发生一次:我不知道你到底在做什么(XY Problem),但可能有更好的设计,当事情看起来像这样棘手时,通常是因为你忽略了一个更好的方法。
nxagd54h4#
可能有用...
一个调试的小例子。
sub DEBUG () {1};
输出sub DEBUG () {0};
输出定量供应perldoc.perl.org/if