我正在读取打开的文件句柄,如下所示:
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一样?还是有另一种方法?
答案 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;