如何在运行时"使用"模块

Dem*_*Dog 1 linux perl

我正在开发一个模块,该模块将在特定条件下调用Perl模块.

而逻辑将是这样的:

$var = "db_tk";

if ( $var =~ /db/ ) {
    use dbi;
}

if ( $var =~ /tk/ ) {
    use tk;
}
Run Code Online (Sandbox Code Playgroud)

我无法在运行时使用它们运行它们require.

ike*_*ami 9

use Module;
Run Code Online (Sandbox Code Playgroud)

相当于

BEGIN {
    require Module;
    import Module;
}
Run Code Online (Sandbox Code Playgroud)

所以你要

 require Module;
 import Module;
Run Code Online (Sandbox Code Playgroud)

除了在运行时从模块导入是没有意义的.所以你要么想要

# Conditionally load modules at runtime.
# Gotta use fully-qualified names to call provided functions.

my $var = "db_tk";

require DBI if $var =~ /db/;
require Tk  if $var =~ /tk/;
Run Code Online (Sandbox Code Playgroud)

要么

# Conditionally load modules at compile-time.

BEGIN {
    my $var = "db_tk";

    if ($var =~ /db/) { require DBI; import DBI; }
    if ($var =~ /tk/) { require Tk;  import Tk;  }
}
Run Code Online (Sandbox Code Playgroud)

所述如果模块可用于简化后者:

# Conditionally load modules at compile-time.

my $var;
BEGIN {
    $var = "db_tk";
}

use if $var =~ /db/, 'DBI';
use if $var =~ /tk/, 'Tk';
Run Code Online (Sandbox Code Playgroud)


Bor*_*din 8

"我无法在运行时使用"require"运行它们"是的,你是.任何use有效的地方require也可以工作:use电话require

假设你的意思是使用标准的CPAN模块DBITk,不dbitk,那么你需要这个

if ( $var =~ /db/ ) {
    use DBI;
}

if ( $var =~ /tk/ ) {
    use Tk;
}
Run Code Online (Sandbox Code Playgroud)

或者,只要您先前已$varBEGIN块中定义,就可以使用该ifpragma

use if $var =~ /db/, DBI;
use if $var =~ /tk/, Tk;
Run Code Online (Sandbox Code Playgroud)