用BEGIN中的变量代替@INC

时间:2014-03-28 17:07:16

标签: perl module directory

所以不要想放

BEGIN {push @INC , '/folder1', '/folder2', '/folder3'}

找到我的模块。 我想能够放一个变量,比如这个。

my $test = '/folder1';
BEGIN {push @INC , $test, '/folder2', '/folder3'}

无论我做什么,它仍然找不到我想要的模块。

3 个答案:

答案 0 :(得分:5)

在解析代码期间执行BEGIN,因此它将在其外部的变量赋值发生之前执行。

解决方案是在BEGIN块内进行分配:

my $test;
BEGIN {
    $test = "/some/path";
}
use lib $test, "/path2", "path3";

use lib …优于unshift @INC, …

答案 1 :(得分:3)

我建议您使用lib

,而不是手动操作@INC
use lib '/folder2', '/folder3';

此外,useBEGIN块会尽快执行,因此如果要将变量包含在一个中,则必须在BEGIN块中初始化:

our $test;
BEGIN {
     $test = "/some/path";
}
use lib $test, '/folder2', '/folder3';

答案 2 :(得分:1)

BEGIN语句在其他任何运行之前运行 - 即使BEGIN语句出现在程序的后面。您正在使用的变量也必须出现在BEGIN内。 my语句结束后,使用BEGIN声明的任何变量都将超出范围。

BEGIN {
     my $test = '/folder1';
     push @INC, $test, '/folder2', '/folder3';
}

我不确定这会给你带来什么。您仍然需要修改程序。您可能需要use lib;

use lib qw(/folder1);
use lib qw(/folder2 /folder3);
# use lib qw(/folder4);   # Don't use