如何在Perl中有条件地使用模块?

06odsfpq  于 2023-02-05  发布在  Perl
关注(0)|答案(4)|浏览(191)

我想在Perl中做类似这样的事情:

$Module1="ReportHashFile1"; # ReportHashFile1.pm
$Module2="ReportHashFile2"; # ReportHashFile2.pm

if(Condition1)
{
  use $Module1;
}
elsif(Condition2)
{
  use $Module2;
}

报告散列文件 *.pm包含一个包报告散列文件 *。
还有如何根据动态模块名引用模块内的数组?

@Array= @$Module1::Array_inside_module;

有什么办法可以做到吗?某种编译指令?

snz8szmq

snz8szmq1#

您可能会发现if模块对此非常有用。
否则,基本思想是使用require,它发生在运行时,而不是use,它发生在编译时。

BEGIN {
    my $module = $condition ? $Module1 : $Module2;
    my $file = $module;
    $file =~ s[::][/]g;
    $file .= '.pm';
    require $file;
    $module->import;
}

对于全局变量的寻址,如果只导出变量或返回变量的函数给调用者,可能会更容易一些,可以使用它的非限定名称,否则也可以使用一个方法并以$Module->method_name的形式调用它。
或者,您可以使用perlref中所述的符号引用,但是,这通常会让代码味道很重。

my @array = do {
    no strict 'refs';
    @{ ${ "${Module}::Array_inside_module" } };
};
4jb9z9bj

4jb9z9bj2#

除非执行速度很重要,否则可以使用字符串eval

if (Condition1) {
    eval "use $Module1"; die $@ if $@;
}
elsif (Condition2) {
    eval "use $Module2"; die $@ if $@;
}
polhcujo

polhcujo3#

人们已经告诉过你如何用Perl原语加载模块,还有Module::Load::Conditional
如果你想访问一个同名的数组,不管你加载的是哪个模块,考虑为它创建一个方法,这样你就可以跳过符号引用的东西,给予每个模块一个同名的方法:

package ReportHashFileFoo;
our @some_package_variable;
sub get_array { \@some_package_variable }

然后,在加载该模块时:

if( ... some condition ... ) {
    eval "use $module" or croak ...;
    my $array_ref = $module->get_array;
    }

2023 update最近我一直在state表达式中使用require,因为它在作用域中只发生一次:

use v5.10;

if( ... some condition ... ) {
    state $rc =  require $module;
    my $array_ref = $module->get_array;
    }

我不知道你到底在做什么(XY Problem),但可能有更好的设计,当事情看起来像这样棘手时,通常是因为你忽略了一个更好的方法。

nxagd54h

nxagd54h4#

可能有用...
一个调试的小例子。

sub DEBUG () {1};               # It's the condition (may be a debuglevel...)

use if DEBUG, Data::Dumper;     # Conditionally load

my $testvar = "foo";
print "Testing: $testvar\n" if     DEBUG;
print "No testing\n"        unless DEBUG;

print Dumper \$testvar if DEBUG;  # "Dumper" only available if "DEBUG" returns "true".

sub DEBUG () {1};输出

Testing: foo
$VAR1 = \'foo';

sub DEBUG () {0};输出

No testing

定量供应perldoc.perl.org/if

相关问题