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

| 我的应用程序读取和写入许多中型到大型文件。我想将它们存储为压缩格式。节省磁盘空间和网络时间。 一种方法是这样做:
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;
  }
}
然后,只需交换调用以打开,即可更改现有代码。 从该函数可以明显看出,我还考虑过使用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\";
现在,变量“ 2”是您可以照常使用的文件句柄。
while (<$z>) {...}
    
只是为了添加一些有关先前答案的信息,在我做的旧工作台上,PerlIO :: gzip比IO :: Uncompress :: Gunzip快。     
查看Perl版本上的IO :: *名称空间。 例如Debian旧稳定版(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\";
    

要回复问题请先登录注册