次のように、空のインポート リストを指定すると、次のようになります。
use MIME::Base64 ();
インポートはありません。つまり、関数名encode_base64
は呼び出し元の名前空間にインポートされません。インポートを許可するか、呼び出すときに関数が存在するパッケージを明示的に参照して関数名を完全修飾することができます。
インポートするには、その行を次のように変更します。
use MIME::Base64;
括弧は、()
MIME::Base64 が名前空間に何もエクスポートしないことを指定しています。デフォルトの動作 (括弧なし) は、エクスポートencode_base64
およびdecode_base64
. インポート リストで空の括弧を使用すると、これら 2 つの関数名をインポートするという便利なデフォルトの動作が上書きされます。main
これらの関数が名前空間を汚染したくない場合は、元のuse MIME::Base64 ()
行を保持してから、サブルーチン呼び出しを完全に修飾することができます。
$encoded = MIME::Base64::encode_base64($base64_string);
しかし、行から括弧を削除して、デフォルトのエクスポート リストを処理できるようにする方がはるかに簡単で、おそらく満足のいくものですuse
。
または、何をインポートするかを正確に指定できます。
use MIME::Base64 ('encode_base64');
encode_base64
これにより、関数のみがインポートされ、 はインポートされないためdecode_base64
、名前空間の汚染が最小限に抑えられます。
更新また、ファイルを読んでいません。この行:
$base64_string = IMAGE;
...次のように更新する必要があります。
$raw_string = do{ local $/ = undef; <IMAGE>; };
$encoded = encode_base64( $raw_string );
有効にしていれば、その問題はより詳細に検出されたはずですuse strict 'subs'
。問題は、" IMAGE
" 自体はただの単語であり、Perl はそれをサブルーチン呼び出しと見なすことです。山括弧 " <>
" は、ファイルハンドルから読み取る一般的な方法です。" local $/ = undef
" の部分は、Perl にとって "\n" のように見える最初のシーケンスまでではなく、ファイル全体を丸呑みすることを保証する手段にすぎません。
Update2: MOB が指摘しているように、パス内のバックスラッシュをエスケープするか、スラッシュを使用する必要があります。Perl は Win32 でも気にしません。もちろん、あなたは を で使用するという賢明な一歩を踏み出してor die $!
いるのでopen
、すでにこの間違いに気づいています。