2010-08-30 68 views
0

編輯 對不起,這裏是我更新的問題。導入一個庫子程序,同時在perl中使用FindBin

我在我的perl腳本使用FindBin這樣的:

use FindBin qw($Bin); 
use lib "$Bin/../lib"; 
use multi_lib qw(say_hello_world); 

這工作:

multi_lib::say_hello_world(); 

但這並不:

say_hello_world(); 

EDIT 2

這是multi_lib.pm的樣子:

package multi_lib; 

use strict; 
use warnings; 
use 5.010; 

require Exporter; 
my @ISA = qw(Exporter); # removing `my` causes an error! 
my @EXPORT_OK = qw(say_hello_world); # removing `my` causes an error! 

sub say_hello_world { 
say "hello world!"; 
} 

p.s. 我不知道@ISA代表什麼,如果加入my是OK ...我跟着Exporter的preldoc。

編輯3 我想我解決它通過use strict之前移動@EXPORT_OK。在我的腳本開頭,我習慣於把use strict放在正確的位置,但我想這不是去這裏的方法(?)。不管怎麼說,這個工作:

use Exporter 'import'; 
@EXPORT_OK = qw(say_hello_world); 
use strict; 
... 

我仍然希望得到一些解釋,究竟是怎麼回事,什麼是出口子程序(像我一樣?)的推薦方式。

+0

是從multi_lib實際導出的say_hello_world? – DVK 2010-08-30 14:32:37

+0

是的,我認爲是。請參閱編輯2. – 2010-08-30 14:39:09

回答

4

你不能做到這一點。 lib的import()例程修改@INC而不是試圖導出任何內容。 但是在任何情況下,lib.pm中都沒有適合外部使用的函數。你真的想完成什麼?

更新的問題更新答案:

不,你不能用我的()上@EXPORT_OK;它需要全局可見,所以出口商可以使用它。 改爲our @EXPORT_OK;。@ISA也是如此;包變量@ISA控制繼承,詞法@ISA不做任何事情。不過,我寧願不從出口商繼承;您剛剛導入導出的進口程序做到這一點(除了非常老出口商):

use Exporter 5.57 'import'; 

你有促使你加入我的()是因爲你指定use strict;(誤差,除其他事項外,要求變量適當聲明,除非它們是由包名或特殊全局變量限定的包變量)。我們的()等價於my(),它將變量聲明爲包變量而不是詞法,因此它們可以在聲明它們的範圍之外訪問。最好用我們的()來正確地聲明它們,而不是僅僅將它們移動到use strict;以避開錯誤。

+0

對不起,請看編輯帖子 – 2010-08-30 14:26:49

+0

@David B:更新了我的回答 – ysth 2010-08-30 14:46:28

+0

你應該說'使用Exporter 5.57'import';'因爲早期版本的Exporter不支持這種使用方式。這樣,有人在古老的Perl上運行你的代碼會得到一個正確的錯誤信息(並且Exporter是可升級的)。 – cjm 2013-03-19 14:41:16

0

這不是圖書館工作的方式。您需要設置庫位置,然後從其中加載一個包含所需子例程的模塊(.pm)。

+0

對不起,請參閱編輯後的文章 – 2010-08-30 14:28:17

0

我想imprt特定 子程序(又名say_hello_world)從 LIB,但這不起作用:

use lib "$Bin/../lib" qw(say_hello_world); 

use lib只是點你到文件所在的目錄,您還需要指定該文件。如果你的子程序是在一個文件Example.pm,那麼你需要

use Example qw(say_hello_world); 

還要注意的是FindBin部分必須是一個BEGIN塊中:

BEGIN { 
    use FindBin qw($Bin); 
    use lib "$Bin/../lib"; 
}; 
use Example qw(say_hello_world); 
+0

對不起,請參閱編輯文章 – 2010-08-30 14:26:52

+0

也,爲什麼BEGIN塊需要在這裏? – 2010-08-30 14:27:46

相關問題