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)
无法真正弄清楚正确的语法.
在你得到线的长度后
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