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($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/

相关文章:

perl - 有没有像用于 Perl 的 Fabric 之类的东西?

compression - 从单独压缩的 block 创建 gzip 流

regex - 为什么 `stoutest` 不是有效的正则表达式?

perl - 在 perl 中重新格式化文本

perl - 使用最新版本的 Perl 为旧版本编写脚本

python - Flask/Tornado 中的 Gzip 响应

java - 如何减少 GZIPOutputStream 的时间

go - 将 int 数组转换为字节数组,压缩然后反转

python - 有没有办法使用 `json.dump` 和 `gzip` ?

linux - 如何在 Perl 中将文件拆分为给定数量的部分? (在 Unix 上)