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)
一个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则按程序中出现的顺序执行块
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |