首页 > 解决方案 > Perl 查找或读取并丢弃结果

问题描述

我正在读取打开的文件句柄,如下所示:

open(my $fh, "-|", "zcat test.csv.gz") or die "Cannot open test.csv.gz:  $!";

read $fh, ???, 256;
print ">>", readline($fh), "<<\n";

close $fh;

现在,我想寻找一个已知位置,在这种情况下为 256 个字节。

我找不到,因为这是一个基于另一个程序的 STDOUT 的文件句柄。我试过了,而 seek() 什么也没做。我可以读取和丢弃数据,但是当寻找一个大的结果时,这会浪费内存加载和丢弃它。

我可以投入什么???这就像 /dev/null?还是有其他方法?

标签: perlio

解决方案


对于 256 字节,这肯定是一个微优化。对于像 256MB 这样的更大搜索,找到您愿意(暂时)牺牲的内存量并执行多次读取。

use List::Util qw( min );

# Making $BUFFER_SIZE a multiple of 16 KiB covers makes sure the read is efficient.
my $BUFFER_SIZE = 65_536;
my $n = 256_000_000;

my $buffer = "";
while ($n) {
    my $bytes_read = sysread($fh, $buffer, min($BUFFER_SIZE, $n));
    die($!) if !defined($bytes_read);
    die("Premature EOF") if !$bytes_read;

    $n -= $bytes_read;
}

# Doesn't necessarily return memory back to the OS,
# but it does makes it available for Perl.
undef $buffer;

推荐阅读