linux - 使用 Perl 将压缩数据写入文件,以便稍后可以即时解压缩(作为 STDIN)

标签 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 以用于 curl 命令:

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

如果我创建文本文件并对其进行 gzip 压缩,则以上内容有效。我一直在寻找一种从 Perl 中执行此操作的优雅方法,我不需要先创建临时文件、压缩它、删除临时文件。

这可能可以通过两种方式实现:

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

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

非常感谢您的帮助。双向

最佳答案

根据我的测试,您的 Perl 代码可以运行,并添加了必要的 use 行:

use IO::Zlib;

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

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

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

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

并使用带有文件名的完整路径,这样您就可以确定文件的生成位置。 (通常会在当前目录下创建,但没有上下文不清楚在什么地方)

关于linux - 使用 Perl 将压缩数据写入文件,以便稍后可以即时解压缩(作为 STDIN),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21443132/

相关文章:

perl - 为什么 Perl 的 Net::FTP 不上传我的文件?

perl - 用解析收集数据::recdescent

我可以在 C 中锁定和解锁 fifo(命名管道)吗?

pipe - Julia - 管道到 Julia REPL

shell - 将文件传输到命令时从 openssl 获取不同的输出

linux - 对 nvidia GPU 上的计算单元和预期核心的混淆

linux - mmap 标志 MAP_UNINITIALIZED 未定义

regex - 从长文件路径(正则表达式)perl 中提取 id

linux - Linux下的IntelliJ Idea,主类上没有这样的文件或目录

linux - 重命名批量文件并更改某些前缀并保存它们