2016-12-07 38 views
2

我有一個perl模塊,我使用MIME :: Base64中的encode_base64函數編寫的。出於某種原因,encode_base64沒有被導出到我的模塊的命名空間。Perl子未導出到模塊

我可能錯過了一些東西,但我希望有人能解釋它是什麼。

這裏是我的模塊:

use strict; 
use Exporter; 
use MIME::Base64; 

package b64_test; 

BEGIN { 
    our $VERSION = 1.00; 
    our @ISA = qw(Exporter); 
    our @EXPORT = qw(enc); 
} 

sub enc { 
    my $msg = shift; 
    my $encoded = encode_base64($msg); 
    print $encoded . "\n"; 
} 

1; 

我使用的模塊,在我的測試腳本位置:

#!/usr/bin/env perl 

use lib '..'; 
use b64_test; 

my $str = "Test"; 

enc($str); 

當我調用的測試腳本,我得到Undefined subroutine &b64_test::encode_base64 called at b64_test.pm line 18.

要確保我的機器沒有問題我做了另一個使用MIME :: Base64的測試腳本,這個工作正常:

#!/usr/bin/env perl 

use MIME::Base64; 

my $encoded = encode_base64("TEST"); 
print $encoded . "\n"; 

這使我相信它與模塊子如何導出到其他模塊有關,但我不知道。任何人都可以對此有所瞭解嗎?

+0

當你在'package b64_test;'後面放置'use MIME :: Base64'時會發生什麼? – Zaid

回答

6

解決方案:package b64_test;置於模塊的頂部。

package語句將編譯單元聲明爲在給定的名稱空間中。包聲明的範圍是從聲明本身到封閉塊,eval或文件的結尾,以先到者爲準。

在你的情況下,你首先有use d模塊並且定義了創建另一個命名空間的包。因此腳本無法找到方法。


模塊: b64_test.pm

[email protected]:~$ cat b64_test.pm 

package b64_test; 
use strict; 
use Exporter; 
use MIME::Base64; 

BEGIN { 
    our $VERSION = 1.00; 
    our @ISA = qw(Exporter); 
    our @EXPORT = qw(enc); 
} 

sub enc { 
    my $msg = shift; 
    my $encoded = encode_base64($msg); 
    print $encoded . "\n"; 
} 

1; 

測試腳本: test.pl

[email protected]:~$ cat test.pl 

#!/usr/bin/env perl  
use lib '.'; 
use b64_test; 

my $str = "Test"; 

enc($str); 

輸出:

[email protected]:~$ perl test.pl 
VGVzdA== 
+1

幹得好,但你應該解釋*爲什麼它有效:) – Zaid

+0

@Zaid:完成。隨意編輯雖然:) –

+0

非常感謝。這很有道理。我知道我必須做錯事。 – bvallerand