我的应用程序读取和写入大量中型到大型文件.我想以压缩格式存储这些内容.节省磁盘空间和网络时间.
一种方法是这样做:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我可以通过将调用交换为open来更改现有代码.
从函数中可以明显看出,我还想过使用zlib/compress库.问题是结果不能作为文件指针传递.
有没有办法做到这一点,不涉及创建一堆额外的进程?
Eri*_*rom 12
来自IO :: Uncompress :: Gunzip的文档
use IO::Uncompress::Gunzip qw($GunzipError);
my $z = IO::Uncompress::Gunzip->new( $input )
or die "IO::Uncompress::Gunzip failed: $GunzipError\n";
Run Code Online (Sandbox Code Playgroud)
该变量$z现在是一个可以像往常一样使用的文件句柄.
while (<$z>) {...}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11336 次 |
| 最近记录: |