从文件中读取n个字节的文本

Ne *_*nne 2 perl bytebuffer text-files

我有一个文本文件,我从它读取第一行,找出它需要多少字节,

open($fh, "<:raw", $file);
my $len;
while (my $row = <$fh>) {
  $len = length $row;
  last;
};
Run Code Online (Sandbox Code Playgroud)

现在我想从中间行+100字节读取该文件,我该怎么做?

就像是

read ($fh, 100, $len/2)
Run Code Online (Sandbox Code Playgroud)

无法真正弄清楚正确的语法.

zdi*_*dim 7

在你得到线的长度后

my $row_len = length <$fh>;  # with newline, or (read then) chomp first
Run Code Online (Sandbox Code Playgroud)

使用seek将把手放在你需要的位置

use Fcntl qw(:seek);

seek $fh, $row_len/2, SEEK_SET;
Run Code Online (Sandbox Code Playgroud)

其中Fcntl提供常量SEEK_SET,SEEK_CUR并且SEEK_END第二个参数中的位置取自开头,当前位置或文件末尾(通常使用负位置时).相反,这些人可以使用0,1,2.

然后读$bytes$data使用的读

my $bytes = 100;
my $data;

my $rb = read $fh, $data, $bytes;
Run Code Online (Sandbox Code Playgroud)

$rb实际从$bytes请求中读出的字节数在哪里.


对于某些文件句柄(一个套接字)read可能不会像一次请求那样多,所以你需要继续阅读.例如,使用OFFSET(参见文档)写入字符串

use bytes qw();

my ($data, $requested, $total_read) = ('', 100, 0); 

while ($total_read < $requested) {
    my $bytes_data = bytes::length $data;
    $total_read += read $fh, $data, $requested - $bytes_data, $bytes_data;
}
Run Code Online (Sandbox Code Playgroud)

其中read现在写入$data在位置$bytes_data(否则每次重写).另一种方法是将每个读取附加到包含所有数据的字符串; 那么应该没有偏移.

虽然bytes::length很好,但是字节pragma通常" 强烈不鼓励 ".


感谢ikegami的评论.

请注意,read不会以任何特殊方式处理"换行符",并且读取可能会从文件的下一行中获取,而这些换行字节确实会计数,从而影响您在文件中的位置.

没有指定下一步你想做什么,但你可以保持(重新定位和)阅读.

有关使用和移动文件的清晰解释,请参阅此文章.seekread