当您指定一个空的导入列表时,如下所示:
use MIME::Base64 ();
你没有进口。这意味着函数名encode_base64
不会被导入调用者的命名空间。您可以允许导入发生,也可以通过在调用它时显式引用它所在的包来完全限定函数名称。
要导入,将该行更改为:
use MIME::Base64;
()
括号指定 MIME::Base64 不向您的命名空间导出任何内容。默认行为(没有括号)是导出encode_base64
和decode_base64
. 通过在导入列表中使用空括号,您将覆盖导入这两个函数名称的方便默认行为。如果您真的不希望这些函数污染您的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
" 部分只是确保您对整个文件进行 slurp 的一种方式,而不仅仅是在第一个对 Perl 看起来像 "\n" 的序列之前。
Update2:正如 MOB 指出的那样,您要么需要转义路径中的反斜杠,要么使用正斜杠。Perl 不介意,即使在 Win32 上也是如此。当然,既然你是在你的 上使用的明智的一步or die $!
,open
你已经发现了这个错误。