2017-02-15 110 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

相關問題