我的应用程序读取和写入大量中到大型文件。我想以压缩格式存储这些。节省磁盘空间和网络时间。
一种方法是这样做:
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 库。问题是结果不能作为文件指针传递。
有没有一种不涉及创建一堆额外进程的方法来做到这一点?
最佳答案
来自 IO::Uncompress::Gunzip 的文档
use IO::Uncompress::Gunzip qw($GunzipError);
my $z = IO::Uncompress::Gunzip->new( $input )
or die "IO::Uncompress::Gunzip failed: $GunzipError\n";
变量
$z
现在是一个文件句柄,您可以照常使用。while (<$z>) {...}
关于perl - 如何在不创建额外进程的情况下访问 gzip 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5667443/