2017-05-31 80 views
0

所以,我通過require加載模塊時遇到了問題。 我們有一個工作目錄。程序加載一個PACKAGE(粗體不要讓你感到困惑)(這是可以的 - 感謝正確的和本地的命名空間),但它必須從非常不同的目錄加載另一個模塊。所以,正如我所聽到的,它應該在BEGIN區塊內未被轉移到@INC。但是......這個開始應該採用一個參數(目前來自初始程序),其中包含一些配置文件的路徑,其中包含我需要的參數(模塊的路徑,我需要不移位)。Perl,不需要@INC動態模塊

BEGIN inited,我檢查@INC - 不移位似乎是成功的。然後,在PACKAGE方法,我們需要加載這個模塊,但是當我嘗試做這樣的事情:

eval{ 
    print STDERR "Trying...\n"; 
    my $path = "path/to/module"; # contains "DIR" dir and "Module.pm", 
    # also tried to write this path as "path/to/module/DIR/Module.pm" 
    require $path; 
    DIR::Module->import(); 
    print STDERR "Success\n"; 
    1; 
} or {print STDERR "Failed\n";} 

my $module = DIR::Module->new(); 

我總覺得「嘗試..」和「失敗」。嘗試完整路徑use lib - 什麼也沒有。我究竟做錯了什麼?

回答

5

你說$path是模塊的路徑,但你也可以說它是包含DIR/Module.pm的目錄的路徑。我假設它是後者,因爲它需要成爲前者。

my $path = "/path/to/lib"; 
require "$path/DIR/Module.pm"; 

記得使用$RealBin如果路徑是相對於你的腳本。

use FindBin qw($RealBin); 

my $path = "$RealBin/../lib"; 
require "$path/DIR/Module.pm"; 

注意,它很少是有道理的,從動態加載的模塊導入。


如果沒有理由,以避免加載在編譯時這個模塊,我會跟

use lib qw(/path/to/lib); 
use DIR::Module; 

着呢,記得用$RealBin如果路徑是相對於你的腳本。

use FindBin qw($RealBin); 
use lib "$RealBin/../lib"; 
use DIR::Module; 
+0

我需要加載運行('require')。所以:在我目前的情況下,'$ path'是從根目錄到模塊的完整路徑。即使在這種情況下我們是否需要使用RealBin?而且我應該DIR :: Module-> import()來使用它的方法嗎? – genesi5

+0

我還需要在初始progarmm中使用它的方法,所以,我認爲我需要導入,但我有命名空間問題 – genesi5

+0

如果它們是方法(即,如果它們被稱爲'$ class-> method'或$ object - > method'),它們沒有意義出口。 – ikegami

相關問題