gpt4 book ai didi

perl - 在 Perl 中,当我从文件(如 fgets)中读取行时,我可以限制行的长度吗?

转载 作者:行者123 更新时间:2023-12-03 05:21:21 25 4
gpt4 key购买 nike

我正在尝试编写一段代码,逐行读取文件并存储每一行​​,直到一定数量的输入数据。除了防止吸入异常大的文件之外,我还想防止最终用户作恶并在一行上放置大量数据。做$str = <FILE>仍然会读整行,这可能会很长并且会破坏我的内存。

fgets 让我可以指定每次调用期间要读取的字节数,并实质上让我将一长行分割成最大长度。 perl 中有类似的方法吗?我看到了一些关于sv_gets的信息但我不知道如何使用它(尽管我只是粗略地进行了谷歌搜索)。

此练习的目标是避免在读取数据后进行额外的解析/缓冲。 fgets 在 N 个字节后或到达换行符时停止。

编辑我想我混淆了一些。我想读取 X 行,每行的最大长度为 Y。我不想读取超过 Z 字节的总数,并且我不想一次读取所有 Z 字节。我想我可以这样做并分开线路,但想知道是否还有其他方法。如果这是最好的方法,那么使用读取函数并进行手动解析是我最简单的选择。

谢谢。

最佳答案

Perl 没有内置 fget,但是 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。

关于perl - 在 Perl 中,当我从文件(如 fgets)中读取行时,我可以限制行的长度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2930465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com