Perl查找或读取并丢弃结果

时间:2018-07-26 15:50:00

标签: perl io

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

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一样?还是有另一种方法?

1 个答案:

答案 0 :(得分:3)

对于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;