Я использую Digest :: MD5 для вычисления MD5 потока данных; а именно GZIP-файл (или, если быть точным, 3000), который слишком велик, чтобы поместиться в ОЗУ. Итак, я делаю это:
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.
Однако мне бы очень хотелось узнать размер скрытых данных (в этом случае «заархивированный» файл).
Я мог бы добавить еще
$size = 0 + `gunzip -c very/big-file.gz | wc -c`;
но для этого нужно прочитать файл дважды.
Есть ли способ извлечь количество байтов, извлеченных из Digest :: MD5? Я попытался захватить результат: $result = $ctx -> addfile(*FILE);
и выполнить Data :: Dumper как для $ result, так и для $ ctx, но ничего интересного не произошло.
Редактировать: файлы часто не распаковываются. Добавлен код, чтобы показать, что я действительно делаю.