我的应用程序读取和写入大量中型到大型文件。我想以压缩格式存储这些内容。节省磁盘空间和网络时间。
这样做的一种方法是:
sub fopen {
my $mode = shift;
my $filename = shift;
if ($filename =~ /\.gz$/) {
if ($mode eq "<") {
open(my $fp, "-|", "/usr/bin/gzcat $filename");
#my $fp = gzopen($filename, "rb") ;
return $fp;
}
if ($mode eq ">") {
open(my $fp, "|-", "/usr/bin/gzip > $filename");
#my $fp = gzopen($filename, "wb") ;
return $fp;
}
} else {
open(my $fp, $mode, $filename);
return $fp;
}
}
然后,我可以通过将调用交换为open来更改现有代码。
从功能中可以明显看出,我还想过使用zlib / compress库。问题是结果不能作为文件指针传递。
有没有办法做到这一点,不涉及创建一堆额外的进程?
答案 0 :(得分:12)
use IO::Uncompress::Gunzip qw($GunzipError);
my $z = IO::Uncompress::Gunzip->new( $input )
or die "IO::Uncompress::Gunzip failed: $GunzipError\n";
变量$z
现在是一个可以照常使用的文件句柄。
while (<$z>) {...}
答案 1 :(得分:1)
只需添加一些有关以前答案的信息,old bench I made,PerlIO::gzip的速度比IO::Uncompress::Gunzip快。
答案 2 :(得分:0)
查看Perl版本上的IO :: *命名空间。
例如Debian old-stable(5 - Lenny)Perl和下一版本,发送IO::Uncompress::Gunzip和IO::Uncompress::AnyUncompress。
#!/usr/bin/perl
use strict ;
use warnings ;
use IO::Uncompress::Gunzip qw(gunzip $GunzipError);
my $input = "file1.txt.gz";
my $output = "file1.txt";
gunzip $input => $output
or die "gunzip failed: $GunzipError\n";