显式设置@INC后使用lib pragma无效

Håk*_*and 3 perl

use feature qw(say);
use strict;
use warnings;
BEGIN {
    @INC = qw(dir1 dir2); # <-- lib pragma works fine if I omit this line
    # @INC = ();  <-- this is what I wanted to do
    use lib 'dir3';
}
say for @INC;
Run Code Online (Sandbox Code Playgroud)

输出:

dir1
dir2
Run Code Online (Sandbox Code Playgroud)

预期产量:

dir3
dir1
dir2
Run Code Online (Sandbox Code Playgroud)

Bor*_*din 9

一个use声明包含一个隐含的内BEGIN块,和所有的Perl BEGIN程序中的块是只要他们完成编译执行

这意味着你在BEGIN这里有嵌套块,并且因为内部的 - use lib 'dir3'语句- 在语句结束时完成编译,所以它是第一个被执行的.接下来是显式BEGIN块的右括号,它完成了块的编译,然后才执行这些语句

这是一个仅使用say语句的示例程序,并使用use显式BEGIN块替换原始语句

use strict;
use warnings;
use feature 'say';

BEGIN {

    say "outer BEGIN";

    BEGIN {
        say "inner BEGIN";
    }
}
Run Code Online (Sandbox Code Playgroud)

产量

inner BEGIN
outer BEGIN
Run Code Online (Sandbox Code Playgroud)

你的代码就好像你这样写了一样

use feature qw(say);
use strict;
use warnings;

use lib 'dir3';

BEGIN {
    @INC = qw(dir1 dir2);
}

say for @INC;
Run Code Online (Sandbox Code Playgroud)

因此,use lib首先执行,添加dir3@INC,然后显式BEGIN块被执行,并覆盖@INC

如果你想先清空@INC,然后用use lib语句添加它,那么你应该写

BEGIN {
    our @INC = ( );
}

use lib 'dir3';
Run Code Online (Sandbox Code Playgroud)

如果没有嵌套,BEGIN则按程序中出现的顺序执行块