我正在尝试编写一段代码,逐行读取文件并存储每行,最多可存储一定数量的输入数据.我想防止最终用户变得邪恶,除了防止吸入异常大的文件之外,还要把一些数据放在一行上.做$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; }
将每个字符连接到$str是有效的,因为Perl会机会性地重新分配.如果Perl字符串有16个字节并且你连接另一个字符,Perl会将它重新分配为32个字节(32个转到64,64到128 ……)并记住长度.接下来的15个连接不需要重新分配内存或调用strlen.