2012-03-09 41 views
6

在Perl中,我们可以这样做:使用LIB用,如果用Perl编译

使用LIB LIST;

在@INC中包含路径列表。同样,我们可以这样做:

如果使用CONDITION,MODULE => ARGUMENTS;

有条件地包含模块。

是否有可能做到两者的混合,像

使用lib如果条件,LIST;

有条件地包括路径列表。这似乎并不奏效。

编辑: 对不起,但我仍然无法工作。这是我正在做的,但它不工作。你能提出什么问题吗?

use Data::Dumper; 

BEGIN { 
    my $env=$ENV{'ENV'}; 
    use if $env eq 'OLD', lib => '/home/vivek/OLD'; 
    use if $env eq 'NEW', lib => '/home/vivek/NEW'; 
} 

print Dumper \@INC; 
+2

您的情况必须在编译时解决。 – tchrist 2012-03-09 13:27:25

+0

我看到它的工作原理是,如果不是将$ ENV {'ENV'}赋值给一个变量,然后使用它,而是直接使用$ ENV {'ENV'}。但是不能在BEGIN块中计算$ env。 – Vivek 2012-03-09 16:38:44

+0

您的示例将无法使用。赋值'my $ env = ...'会在'use if'后面运行。 'if if'先走。你必须有一个完全封闭的'BEGIN'块来分配给一个非我的变量,然后在这个块之外和之下,使用你的'use if'来涉及到这个变量。 – tchrist 2012-03-09 17:31:36

回答

10
if

是一个独立的模块(严格意义上的编译),其采用的线作为参数的其余部分。 lib也是一个单独的编译指示。看看,文件的语法use if CONDITION, MODULE => ARGUMENTS,你会看到什么,你应该写为

use if CONDITION, lib => LIST; 

工作正常。

+4

人们总是忘记条件只能涉及编译时表达式。 – tchrist 2012-03-09 13:28:02

+0

@tchrist - 表达式可能只是一个在BEGIN {}块中计算的变量,是正确的? – DVK 2012-03-09 13:37:10

+0

* CONDITION *可以是编译中相关位置可用的任何内容,因此前面的'BEGIN'块中的任何内容都包括包变量和子例程。 (请注意,这样的子例程显然也必须在调用它时具有任何可用的依赖关系。) – Borodin 2012-03-09 13:44:06