2015-12-14 62 views
2

我之前有use Foo;使用我編寫的模塊,並且使用了使用Exporter.pm導出的方法和變量。從嚴格要求的模塊中使用導出的變量

我用require替換了use,以便在模塊導入時有一定的靈活性。我現在得到幾十個錯誤,都說明這些符號「需要明確的包名稱」。

我知道我可以爲每個添加明確的方法名稱,但也有不少。

有沒有辦法給這些別名一次,這樣以後我可以每次都使用沒有顯式包的符號?

+3

調用'import'方法。 – toolic

+0

@toolic導入方法不能解決我的問題,但現在我正在考慮這個問題,我可能會混淆兩個問題。我的IDE給我編譯時錯誤,我現在無法運行代碼來確認是否我會得到運行時錯誤,或者如果這是純粹的編譯器不知道我將從哪裏導入(導入目錄是由配置文件) – dsollen

+1

總是有'Foo :: var'代替。或者使用BEGIN塊。或者使用類似FindBin的東西來進行編譯時路徑評估 – Sobrique

回答

4

「我加載在一個配置文件中指定的位置的模塊,所以它在運行時做」

好了,但它已在運行時可以這樣做你是問錯了問題

做這個

use strict; 
use warnings 'all'; 

use constant CONFIG_FILE => '/path/to/config_file'; 

my $libs; 

BEGIN { 
    open my $fh, '<', CONFIG_FILE or die $!; 
    chomp($libs = <$fh>); 
} 

use lib $libs; 

use MyLib; # MyLib.pm is in the directory specified in config_file 
2

您需要在符號被編譯器遇到之前導入這些符號。

您可以更快地加載符號。

use Foo; 

sub moo { ... $SymbolImportedFromFoo ... } 

您可以稍後編譯提及。

eval(<<'__EOI__') or die [email protected]; 

    use Foo; 

    sub moo { ... $SymbolImportedFromFoo ... } 

    1; 

__EOI__ 
+0

我不想在編譯時做任何事情。我從配置文件中指定的位置加載模塊,所以它必須在運行時完成... – dsollen

+0

「我不想在編譯時做事情」,太糟糕了。我再說一遍:在編譯器遇到代碼之前,您需要導入這些符號。 – ikegami

+0

我意識到,但是肯定有一些方法可以告訴編譯器,我希望符號X和Y在編譯時來自模塊Foo,即使我在運行時加載模塊? – dsollen