2017-02-15 129 views
4

在Perl 5.24.1中使用use liblib->import有什么区别? 我看到两个用于将目录添加到@INC。 我正在使用股票Perl没有附加组件。 我已阅读 http://perldoc.perl.org/lib.html 我不太了解所有使用方法。在Perl中,`use lib`和`lib-> import`有什么区别?

下面是一个例子:

在下面的示例代码中的第一个use lib总是工作,而第二个lib->import在我的代码,我看到它在其他代码运行在同一台机器上的失败。

#!/usr/bin/perl -T 

use warnings; 
use diagnostics; 
use strict; 
# new perl 2.24.1 requires FindBin 
use FindBin; 
print "found: $FindBin::Bin\n"; 
#This always works: 
#use lib $FindBin::Bin; 
#why does this not always work? 
#lib->import($FindBin::Bin); 

foreach my $var(@INC){ 
    print "$var \n"; 
} 

回答

3

use lib EXPR加载lib.pm,并在编译时调用lib->import(EXPR)

只是在做lib->import(EXPR)将做同样的事情,除了如果lib.pm没有被加载,它什么都不会做。 (如果没有这样的子对象,方法调用import()或unimport()会被忽略)。但是它会在运行时被执行,除非你在BEGIN块中有它,这意味着对@INC的更改不会是及时执行以影响以后的use

+0

非常感谢您的帮助! – turtle

3
use lib $FindBin::Bin; 

将做到这一点(大约):

BEGIN { require "lib.pm"; lib->import($FindBin::Bin); } 

这两个负载/编译lib.pm和呼叫在编译时(因此BEGIN块)导入

当你调用本身lib->import(...),这工作,但只有当LIB已经加载无论你是“进口”在运行VS编译的时候才有意义。随着lib的导入,这工作正常,但只影响未来require(或eval "use ...")调用。对于其他软件包,如果您试图导入诸如函数之类的东西,这可能是荒谬的,尤其是如果这些函数具有影响编译时解析度的原型。

+0

谢谢你,这是非常有益的。 – turtle

相关问题