Perl 如何在不创建其他进程的情况下访问gzip文件?

Perl 如何在不创建其他进程的情况下访问gzip文件?,perl,gzip,Perl,Gzip,我的应用程序读取和写入大量中大型文件。我想以压缩格式存储这些文件。节省磁盘空间和网络时间 一种方法是: sub fopen { my $mode = shift; my $filename = shift; if ($filename =~ /\.gz$/) { if ($mode eq "<") { open(my $fp, "-|", "/usr/bin/gzcat $filename"); #my $fp = gzopen($filena

我的应用程序读取和写入大量中大型文件。我想以压缩格式存储这些文件。节省磁盘空间和网络时间

一种方法是:

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;
  }
}
sub-fopen{
我的$mode=shift;
我的$filename=shift;
如果($filename=~/\.gz$/){
如果($mode eq“”){
打开(my$fp,“|-”,“/usr/bin/gzip>$filename”);
#我的$fp=gzopen($filename,“wb”);
返回$fp;
}
}否则{
打开(我的$fp,$mode,$filename);
返回$fp;
}
}
然后,我可以通过交换对open的调用来更改现有代码

从函数中可以明显看出,我还考虑过使用zlib/compress库。问题是结果不能作为文件指针传递


有没有一种方法不需要创建一堆额外的过程呢?

来自

变量
$z
现在是一个文件句柄,您可以像往常一样使用它

while (<$z>) {...}
while(){…}

查看Perl版本上的IO::*命名空间

例如,DebianOldStable(5-Lenny)Perl和下一个版本将发布和


只需添加一些关于以前答案的信息,从一个,比。

额外的过程可能会有用。如果您的perl进程做了很多工作,并且您有多个处理器,那么您可以通过使用一个单独的进程(在1个CPU上)专门用于压缩/解压,然后使用整个进程(在第2个CPU上)专门用于perl程序来获得更好的性能。计算机的任务是为您运行进程。不要回避他们。
while (<$z>) {...}
#!/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";