Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl查找或读取并丢弃结果_Perl_Io - Fatal编程技术网

Perl查找或读取并丢弃结果

Perl查找或读取并丢弃结果,perl,io,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; open(my$fh,“-|”,“zcat test.csv.gz”)或die“Cannot open test.csv.gz:$!”; 读

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

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

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

close $fh;
open(my$fh,“-|”,“zcat test.csv.gz”)或die“Cannot open test.csv.gz:$!”;
读作$fh,?256;

打印“>>”,读线($fh),“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;

修复了一些问题:1)
read
(和
sysread
)返回的量可能小于请求的量,特别是在从普通文件以外的其他文件读取时。2)
sysread
read
更有效,因为它是一个开销小得多的单个系统调用。
sysread
不支持PerlIO层(例如
:encoding
),因此,如果您使用这些选项,请切换回
read
。3)IO缓冲区大小在不久前被切换到8 KiB。当然,对于
sysread
,这并不重要。好的,因此必须使用一个具有良好大小缓冲区的while循环并重复读取。是的,我确实在尝试查找接近数千GB文件结尾的文件,256只是为了说明。这似乎工作得很好。Re“我试过了,seek()什么也不做。”,它返回error
ESPIPE