将"file"linux命令应用于Perl中的二进制缓冲区

rli*_*lib 2 linux perl image file raw-data

从Web上检索后,我在缓冲区中有图像:

my $img = $webapi->get('http://myserver.com/image/123423.jpg');
Run Code Online (Sandbox Code Playgroud)

通话结束后,原始数据在$ img中.我想确保数据代表图像而不是文本,因此我将其保存到磁盘上的文件并运行file命令:

open my $fh, '>', '/tmp/images/rawdata.bin';
print $fh $img;
close $fh;
$res = `file /tmp/images/rawdata.bin`;
if ($res =~ 'GIF|JPEG|PNG') print "Image";
else "Not image";
Run Code Online (Sandbox Code Playgroud)

如何避免将原始数据保存到文件并在内存中完成工作?

Sob*_*que 11

file可以从中读取数据STDIN.所以最简单的方法可能是:

open ( my $file_cmd, '|-', 'file -' ) or die $!;
print {$file_cmd} $img;
print <$file_cmd>;
Run Code Online (Sandbox Code Playgroud)

似乎有一个模块 - File::Type这样做.我的快速测试意味着它并不像file让它变得有用一样聪明.