我有一个使用两个模块的Perl脚本。第一个模块也使用第二个模块。
如果第一个模块执行use lib 'dir1'
,脚本执行use lib 'dir2'
:
module1.pm
use lib "dir1";
use module2;
script.pl
use lib "dir2";
use module1;
use module2;
第一个模块正在使用哪个目录?脚本use lib, 'dir2'
是否覆盖了第一个模块中的use lib, 'dir1'
,还是它们的范围不同?
我做了自己的测试,并在module1.pm和script.pl中打印了@INC,结果是dir1位于@INC的顶部。
答案 0 :(得分:2)
lib
pragma只执行unshift
到全局(和包独立)数组@INC
的路径。除非明确地完成,否则不会从@INC
删除任何内容。
第一次遇到它是在script.pl
的第一行,所以此后@INC
将包含dir2
。
接下来发生的事情是script.pl
编译并运行module1.pm
。 (它将首先在dir2
中查找,然后在最初位于@INC
的目录中查找。)该文件的第一行包含另一个use lib
,unshift @INC, 'dir1'
}。
此后@INC
保持不变。任何进一步的use
或require
将首先查看dir1
(因为它已被移动到最后),然后是dir2
,然后是@INC
的其余部分。
答案 1 :(得分:1)
请参阅use lib
上的perl文档:http://perldoc.perl.org/lib.html
当script.pl运行时,它会添加" dir2"到@INC
。然后,它将在@INC
中列出的目录中查找module1,以" dir2"开头。
当它加载module1时,它将在前面加上" dir1"到@INC
,然后在@INC
中列出的目录中查找并加载module2,该目录以dir1开头,然后是dir2,然后是@INC
中的其余目录。一旦加载module2,它将完成加载module1。
此时将忽略script.pl中的use module2
行。
答案 2 :(得分:0)
您显然知道lib
适用于@INC
数组。但是,您似乎将其视为由后续用法替换的单个值的数组。
鲍罗丁已经很好地解释了这些机制,lib
的文档做得更好。但是,也许一些示例脚本会有所帮助:
use strict;
use warnings;
use Data::Dump qw(dump);
# Set @INC to minimum required for lib
BEGIN {
require lib;
@INC = $INC{'lib.pm'} =~ s/lib.pm//r;
print "\@INC = " . dump(@INC) . "\n\n";
}
# Try adding two directories
use lib 'foo';
BEGIN {
print "use lib 'foo';\n";
print "# \@INC is " . dump(@INC) . "\n\n";
}
use lib 'bar';
BEGIN {
print "use lib 'bar';\n";
print "# \@INC is " . dump(@INC) . "\n\n";
}
# Remove a directory
no lib 'foo';
BEGIN {
print "no lib 'foo';\n";
print "# \@INC is " . dump(@INC) . "\n";
}
输出:
@INC = "C:/strawberry/perl/lib/"
use lib 'foo';
# @INC is ("foo", "C:/strawberry/perl/lib/")
use lib 'bar';
# @INC is ("bar", "foo", "C:/strawberry/perl/lib/")
no lib 'foo';
# @INC is ("bar", "C:/strawberry/perl/lib/")