我正在开发一个模块,可以在特定条件下调用Perl模块。
逻辑将是这样的:
$var = "db_tk";
if ( $var =~ /db/ ) {
use dbi;
}
if ( $var =~ /tk/ ) {
use tk;
}
我无法在运行时使用require
运行它们。
答案 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模块DBI
和Tk
,而不是dbi
和tk
,那么您需要这个
if ( $var =~ /db/ ) {
use DBI;
}
if ( $var =~ /tk/ ) {
use Tk;
}
或者,只要您之前在$var
块中定义了BEGIN
,就可以使用if
pragma
use if $var =~ /db/, DBI;
use if $var =~ /tk/, Tk;