使用Perl将压缩数据写入文件,以便以后可以在运行时解压缩(如STDIN)

时间:2014-01-29 21:34:52

标签: linux perl pipe compression

我正在寻找一种创建压缩文件的技术组合。 后来我想在运行中解压缩该文件并通过管道传递给curl命令。

问题是我正在使用的代码生成一个保存压缩数据流的文件(而不是文件):

my $fh = IO::Zlib->new("file.gz", "wb9");
if (defined $fh) {
    print $fh "some big data here!\n";
    $fh->close;
}

因此我不能简单地使用zcat解压缩它:

zcat file.gz
zcat: can't stat: file.gz (file.gz.Z): No such file or directory

并且这样做的全部原因是我希望稍后将zcat输出重定向为STDIN for curl命令:

zcat file.gz | curl -X PUT -d @- http://localhost:5822/

如果我创建文本文件并对其进行gzip,则上述工作正常。我正在寻找一种优雅的方式从Perl中完成它,在那里我不需要创建临时文件,压缩它,首先删除临时文件。

这可能有两种方式实现:

1)找到一种方法来创建包含文件数据的压缩文件(而不是数据流)

2)找到一个Linux / Unix / OSX命令来处理带有流压缩数据的文件(比如zcat显然不能)

非常感谢帮助。两种方式

1 个答案:

答案 0 :(得分:2)

您的Perl代码适用于我的测试,并添加了必要的使用行:

use IO::Zlib;

您说您的代码会生成一个包含压缩数据流的文件(而不是文件)。这没有任何意义。文件是文件。它是包含字节序列的文件系统中的对象。您的代码生成一个普通文件,其内容是Zlib的压缩输出。

我认为您的问题是代码由于某种原因(缺少权限?)而无法生成文件,或者您只是在寻找文件的错误位置。

添加一些调试以查看文件是否成功打开。用

替换“新”行
my $fh = new IO::Zlib;
$fh->open("/full/path/to/filename", "wb9") or die("couldn't open file for writing: $!");

使用带文件名的完整路径,以便确定文件的生成位置。 (通常它会在当前目录中创建,但不清楚没有上下文的位置)