Perl脚本和Perl模块使用`use lib`并引用相同的模块

时间:2014-08-22 15:41:33

标签: perl

我有一个使用两个模块的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的顶部。

3 个答案:

答案 0 :(得分:2)

lib pragma只执行unshift到全局(和包独立)数组@INC的路径。除非明确地完成,否则不会从@INC删除任何内容。

第一次遇到它是在script.pl的第一行,所以此后@INC将包含dir2

接下来发生的事情是script.pl编译并运行module1.pm。 (它将首先在dir2中查找,然后在最初位于@INC的目录中查找。)该文件的第一行包含另一个use libunshift @INC, 'dir1' }。

此后@INC保持不变。任何进一步的userequire将首先查看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/")