我一直将数据写入档案。在每条记录之后,我需要知道生成的文件的大小。要解决这个问题,我使用缓冲区:
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use feature 'say';
use IO::Compress::Gzip qw| $GzipError :flush |;
my $out_file_name = 'out.gz';
my $buf;
open my $out, '>', $out_file_name;
my $ft = Z_PARTIAL_FLUSH;
my $gzip = IO::Compress::Gzip->new(\$buf);
$gzip->print("some data");
$gzip->flush($ft);
$gzip->print("some data2");
$gzip->flush($ft);
print $out $buf;
$gzip->close;
close $out;
当脚本完成后,我测试结果并得到以下错误:
$ gzip -cd out.gz
some data1
some data2
gzip: out.gz: unexpected end of file
为什么会出现此错误。如何避免呢?
答案 0 :(得分:2)
您必须在将$buf
写入输出文件之前关闭gzip流:
$gzip->close;
print $out $buf;
close $out;
$gzip->close
调用将一些终止数据写入缓冲区的末尾以完成gzip编码。在您的示例中,您没有将此数据写入文件,因此当您尝试稍后解压缩时,gzip无法找到它期望在那里看到的数据。