我正在开发一个模块,该模块将在特定条件下调用Perl模块.
而逻辑将是这样的:
$var = "db_tk";
if ( $var =~ /db/ ) {
use dbi;
}
if ( $var =~ /tk/ ) {
use tk;
}
Run Code Online (Sandbox Code Playgroud)
我无法在运行时使用它们运行它们require.
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)
"我无法在运行时使用"require"运行它们"是的,你是.任何use有效的地方require也可以工作:use电话require
假设你的意思是使用标准的CPAN模块DBI和Tk,不dbi和tk,那么你需要这个
if ( $var =~ /db/ ) {
use DBI;
}
if ( $var =~ /tk/ ) {
use Tk;
}
Run Code Online (Sandbox Code Playgroud)
或者,只要您先前已$var在BEGIN块中定义,就可以使用该ifpragma
use if $var =~ /db/, DBI;
use if $var =~ /tk/, Tk;
Run Code Online (Sandbox Code Playgroud)