在__DATA__句柄中存储二进制数据

kob*_*ame 4 perl

在模块中,我需要一些Imager :: Search操作的图像数据(BMP).以下作品,

my $pattern = Imager::Search::Pattern->new(
     driver => 'Imager::Search::Driver::BMP24',
     file   => 'test.bmp', #load the image from a file
);
Run Code Online (Sandbox Code Playgroud)

图像(test.bmp)对我来说是恒定的,所以想直接在源代码作为其存储

my $image = ... the image data ... ;
Run Code Online (Sandbox Code Playgroud)

或在该__DATA__部分.

什么是存储二进制数据(如此test.bmp)的推荐方法__DATA__?(2.3kb的).

Dav*_*idO 10

您可能不希望处理在源文件中存储原始二进制数据的麻烦,但这并不意味着您仍然无法使用将该图像存储在该__DATA__段中的解决方案.您只需先以纯文本格式对其进行编码,例如Base64.

Mojolicious就是这种事情的一个例子.使用Mojolicious :: Lite,可以在节中嵌入模板和其他静态内容__DATA__.并且Base64编码的数据是一种可能性,如Mojolicious :: Guides :: Tutorial#Static Files中所述.

要点是要证明有时使用这种方法.如果要实现使用此方法的解决方案,则可以使用核心Perl模块MIME :: Base64.这是一个示例,其中一些任意普通旧文本以Base64格式存储,并检索以供使用.但是,由于Base64编码可以用于二进制数据,因此该示例可以适用于存储图像.

use MIME::Base64;

my $foo = do {
    local $/ = undef;
    decode_base64(<DATA>);
};

print "<<$foo>>\n";

__DATA__
SnVzdCBhbm90aGVyClBlcmwgaGFja2VyLA==
Run Code Online (Sandbox Code Playgroud)

  • 非常好的答案(反对"不要做",就像无益的评论).完全符合我的要求.非常感谢你. (2认同)
  • 正确的是,用户将二进制数据编码为base64,然后将*that*放在`__DATA__`部分.它很容易解码,MIME :: Base64模块附带Perl. (2认同)