MIME :: Base64のencode_base64関数を使用して作成したperlモジュールがあります。何らかの理由で、encode_base64がモジュールのネームスペースにエクスポートされていません。
私はおそらく何かを見逃していますが、誰かがそれが何であるか説明できることを望みます。
ここに私のモジュールがあります:
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";
これは、モジュールのサブが他のモジュールにエクスポートされる方法と関係があると私を信じさせますが、私は知りません。誰もこれに光を当てることができますか?
回答:
回答№1は6溶液: 置く package b64_test;
モジュールの上部にあります。
パッケージ文はコンパイルを宣言します指定された名前空間にあるユニット。パッケージ宣言の範囲は、宣言自体から、囲んでいるブロック、eval、またはファイルのいずれか早い方までです。
あなたの場合、あなたは use
dモジュールが最初に、別の名前空間を作成したパッケージを定義しました。したがって、スクリプトはメソッドを見つけることができません。
モジュール: b64_test.pm
chankeypathak@stackoverflow:~$ 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
chankeypathak@stackoverflow:~$ cat test.pl
#!/usr/bin/env perl
use lib ".";
use b64_test;
my $str = "Test";
enc($str);
出力:
chankeypathak@stackoverflow:~$ perl test.pl
VGVzdA==