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

前端之家收集整理的这篇文章主要介绍了在Perl中,当我从文件中读取它时,我可以限制一行的长度(比如fgets)吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试编写一段代码,逐行读取文件并存储每行,最多可存储一定数量的输入数据.我想防止最终用户变得邪恶,除了防止吸入异常大的文件之外,还要把一些数据放在一行上.做$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.

猜你在找的Perl相关文章