在bash中,您可以连接gzipped文件,结果是一个有效的gzipped文件。据我所知,我一直能够将这些“级联”的gzipped文件视为普通的gzipped文件(我的示例代码来自上面的链接):
echo 'Hello world!' > hello.txt
echo 'Howdy world!' > howdy.txt
gzip hello.txt
gzip howdy.txt
cat hello.txt.gz howdy.txt.gz > greetings.txt.gz
gunzip greetings.txt.gz
cat greetings.txt哪种输出
Hello world!
Howdy world!但是,当试图使用Perl的模块读取同一个文件时,它不会超过第一个原始文件。结果如下:
./my_zcat greetings.txt.gz
Hello world!下面是my_zcat的代码:
#!/bin/env perl
use strict;
use warnings;
use v5.10;
use IO::Uncompress::Gunzip qw($GunzipError);
my $file_name = shift;
my $fh = IO::Uncompress::Gunzip->new($file_name) or die $GunzipError;
while (defined(my $line = readline $fh))
{
print $line;
}如果我在创建一个新的压缩文件之前完全解压缩这些文件,那么我没有这个问题:
zcat hello.txt.gz howdy.txt.gz | gzip > greetings_via_zcat.txt.gz
./my_zcat greetings_via_zcat.txt.gz
Hello world!
Howdy world!那么,greetings.txt.gz和greetings_via_zcat.txt.gz之间的区别是什么?为什么IO::Uncompress::Gunzip可以正确地与greetings.txt.gz一起工作?
基于这个回答另一个问题,我猜IO::Uncompress::Gunzip是因为文件之间的元数据而搞砸的。但是,由于greetings.txt.gz是一个有效的Gzip文件,我希望IO::Uncompress::Gunzip能够工作。
我现在的解决办法是使用zcat (当然,这对Windows用户没有多大帮助):
#!/bin/env perl
use strict;
use warnings;
use v5.10;
my $file_name = shift;
open(my $fh, '-|', "zcat $file_name");
while (defined(my $line = readline $fh))
{
print $line;
}发布于 2016-12-08 19:50:00
在IO::Compress部分处理连接的gzip文件中显式地介绍了这一点。基本上,在构造IO::Uncompress::Gunzip对象时,只需包含MultiStream选项即可。
下面是一个选项:
MultiStream => 0|1如果输入文件/缓冲区包含多个压缩数据流,则此选项将将整批数据解压缩为单个数据流。 默认为0。
所以你的代码需要这个改变
my $fh = IO::Uncompress::Gunzip->new($file_name, MultiStream => 1) or die $GunzipError;https://stackoverflow.com/questions/41045834
复制相似问题