首页 > 解决方案 > 在 Perl 中从管道中读取 X 个字节

问题描述

从 Perl 的管道中读取 x 个二进制字节的最佳方法是什么?使用 sysread 仅返回 8K 字节。在继续脚本的其余部分之前,我需要从管道中读取大约 1GB 的字节。显然,我可以自己将所有 8K 块组合在一起,但我希望这样的东西已经存在,而不必自己编写代码。

标签: perlpipe

解决方案


使用sysread仅返回 8K 字节

不太具体,它返回所有可用字节,直到提供的最大值。(如果管道中没有,它将等待一些到达。)

在继续脚本的其余部分之前,我需要从管道中读取大约 1GB 的字节。

我不确定是否有办法检查管道中等待的字节数,但没有系统具有可以容纳 1 GB 或 1 GiB 的管道。只是循环阅读。

use constant TO_READ => 1000*1000*1000;  # Or 1024*1024*1024?

my $buf = '';
while (length($buf) < TO_READ) {
   my $rv = sysread($fh, $buf, TO_READ-length($buf), length($buf));
   defined($rv)
      or die("Can't read from file: $!\n");
   $rv
      or die("Can't read from file: Premature EOF\n");
}

您可以轻松地使用read. 和 和有什么不一样?readsysread


推荐阅读