【发布时间】:2010-05-30 15:03:01
【问题描述】:
我正在尝试编写一段代码,它逐行读取文件并存储每一行,最多可存储一定数量的输入数据。除了防止吸入异常大的文件外,我还想防止最终用户作恶并在一行上放置类似演出的数据。执行$str = <FILE> 仍然会读一整行,这可能会很长并且会破坏我的记忆。
fgets 让我通过让我在每次调用期间指定要读取的字节数来做到这一点,并且基本上让我将一根长线分成我的最大长度。在 perl 中是否有类似的方法可以做到这一点?我看到了一些关于 sv_gets 的东西,但不知道如何使用它(虽然我只是粗略地在 Google 上搜索了一下)。
本练习的目标是避免在读取数据后进行额外的解析/缓冲。 fgets 在 N 个字节后或到达换行符时停止。
编辑我想我有些困惑。我想读取 X 行,每行的最大长度为 Y。我不想读取超过 Z 字节的总数,并且我不想一次读取所有 Z 字节。我想我可以这样做并拆分线路,但想知道是否还有其他方式。如果这是最好的方法,那么使用读取功能并进行手动解析是我最简单的选择。
谢谢。
【问题讨论】:
-
为什么不希望一次读取所有 Z 字节?您在寻找 get_n_lines_or_max_bytes(fh, n, z) 函数吗?这样的野兽并不难写……
-
我想这只是一个偏好问题。当我可以增量解析时,我讨厌吸入大量数据。另外,我也会忽略一些数据,所以为什么要先占用不必要的内存。我认为这是一种易于维护/编写的解决方案。
-
@SB:测试一下。你会发现调用 read() 和 split() 比使用任何 fgets() 实现使用更少的内存并且运行得更快。