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

时间:2016-10-10 02:31:33

标签: linux perl

我正在开发一个模块,可以在特定条件下调用Perl模块。

逻辑将是这样的:

$var = "db_tk";

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

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

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

2 个答案:

答案 0 :(得分:9)

use Module;

相当于

BEGIN {
    require Module;
    import Module;
}

所以你想要

 require Module;
 import Module;

除了在运行时从模块导入没有任何意义。所以你要么

# 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/;

# 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;  }
}

if module可用于简化后者:

# Conditionally load modules at compile-time.

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

use if $var =~ /db/, 'DBI';
use if $var =~ /tk/, 'Tk';

答案 1 :(得分:8)

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

假设您打算使用标准CPAN模块DBITk,而不是dbitk,那么您需要这个

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

if ( $var =~ /tk/ ) {
    use Tk;
}

或者,只要您之前在$var块中定义了BEGIN,就可以使用if pragma

use if $var =~ /db/, DBI;
use if $var =~ /tk/, Tk;