2016-12-07 10 views
2

私は、MIME :: Base64のencode_base64関数を使用して作成したperlモジュールを使用しています。何らかの理由で、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

'use MIME :: Base64;'を 'package b64_test;'の後ろに置くとどうなりますか? – Zaid

答えて

6

解決策:package b64_test;をモジュールの上部に置きます。

packageステートメントは、コンパイル単位が指定された名前空間にあるものとして宣言します。パッケージ宣言のスコープは、宣言自体から、囲みブロック、評価、またはファイルのいずれか早い方の終わりまでです。

最初にuseモジュールがあり、別の名前空間を作成したパッケージを定義しました。したがって、スクリプトはメソッドを見つけることができません。


モジュール: 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

関連する問題