【发布时间】:2019-04-16 17:28:01
【问题描述】:
我正在使用 Digest::MD5 来计算数据流的 MD5;即一个 GZIPped 文件(或者准确地说,3000),它太大而无法放入 RAM。所以我这样做:
use Digest::MD5 qw(md5_base64);
my ($filename) = @_; # this is in a sub
my $ctx = Digest::MD5 -> new;
$openme = $filename; # Usually, it's a plain file
$openme = "gunzip -c '$filename' |" if ($filename =~ /\.gz$/); # is gz
open (FILE, $openme); # gunzip to STDOUT
binmode(FILE);
$ctx -> addfile(*FILE); # passing filehandle
close(FILE);
这是成功的。 addfile 在 gunzip 的输出中巧妙地啜饮并给出正确的 MD5。
但是,我真的非常想知道 slurped 数据的大小(在这种情况下是压缩的“文件”)。
我可以添加一个额外的
$size = 0 + `gunzip -c very/big-file.gz | wc -c`;
但这将涉及两次读取文件。
有什么方法可以提取从 Digest::MD5 中提取的字节数?我尝试捕获结果:$result = $ctx -> addfile(*FILE); 并在 $result 和 $ctx 上执行 Data::Dumper,但没有出现任何有趣的结果。
编辑:这些文件通常不会被 gzip 压缩。添加代码以显示我的实际工作。
【问题讨论】:
-
也许使用IO::Uncompress::Gunzip 一次读取文件一个块并计算数据的长度及其摘要,而不是依赖外部程序?