我正在尝试编写一段代码,逐行读取文件并存储每一行,最多可存储一定数量的输入数据.我想防止最终用户变得邪恶,除了防止吸入异常大的文件之外,还要把一些数据放在一行上.做的$str = <FILE>事情仍然会读完整行,这可能会很长,并且会让我记忆犹新.
fgets允许我通过让我在每次调用期间指定要读取的字节数来实现这一点,并且基本上让我将一条长行拆分为我的最大长度.在perl中有类似的方法吗?我看到了一些sv_gets但不确定如何使用它(虽然我只是粗略的谷歌搜索).
本练习的目的是避免在读取数据后进行额外的解析/缓冲.fgets在N个字节后或达到换行符时停止.
编辑我觉得我很困惑.我想读取X行,每行最大长度为Y.我不想读取超过Z字节的总数,我宁愿不一次读取所有Z字节.我想我可以这样做并分割线,但想知道是否还有其他方法.如果这是最好的方法,那么使用read函数和手动解析是我最容易的选择.
谢谢.
Perl没有内置的fgets,但是File :: GetLineMaxLength实现了它.
如果你想自己做,那就非常简单了getc.
sub fgets {
my($fh, $limit) = @_;
my($char, $str);
for(1..$limit) {
my $char = getc $fh;
last unless defined $char;
$str .= $char;
last if $char eq "\n";
}
return $str;
}
Run Code Online (Sandbox Code Playgroud)
将每个字符连接起来$str是有效的,因为Perl会机会性地重新分配.如果Perl字符串有16个字节并且你连接另一个字符,Perl会将它重新分配为32个字节(32个转到64,64到128 ......)并记住长度.接下来的15个连接不需要重新分配内存或调用strlen.
| 归档时间: |
|
| 查看次数: |
1645 次 |
| 最近记录: |