0

当我想从文件中读取时,我使用以下代码:

open my $fh, "file_path";
while(<$fh>)
{
    # do something here
}

但是如果文件非常大,我会担心 IO 性能,因为它是逐行读取磁盘的。

在 C 程序中,我们可能更喜欢一次将几个字节(例如:4096 字节)读入内存(调用“fread”函数)。这可以减少磁盘 IO 操作的数量,并有利于程序的性能。

所以我的问题是:有没有办法在 Perl 中一次从文件中读取多行或几个字节?还是 Perl 会封装 IO 细节,我不需要担心?

4

3 回答 3

5

是的,默认情况下 IO 是缓冲的,请参阅openperliol

如果你想访问 C 风格的函数,你可以使用sysopen& 。sysread

于 2013-07-17T10:32:14.867 回答
3

当您使用 . 打开文件时open,文件句柄和物理资源之间有不同的层。这些层可以是缓冲层(可以为输出文件句柄关闭)或 PerlIO 层。

PerlIO 层可以进行编码或行结束转换。例如,要打开一个 UTF-8 编码的文件,我们会

use autodie; # throw fatal exception when open fails
open my $fh, "<:utf8", $filename;

可以在:layer打开模式后使用打开模式指定层。-layer:uft8是. :encoding(uft8)层也可以通过添加binmode

如果你想从这样的文件句柄中读取一个固定长度的字符串到一个缓冲区中,你可以使用非常 C-ish read

如果您想要对文件进行无缓冲访问,您可以使用sysopen/ sysread,但您不太可能遇到这样有益的情况。在这种情况下,您不能使用图层,这对文本数据很不利。

如果您只想一次读取整个文件,则应使用File::Slurp针对此用例进行了优化的模块。但是对于常规的逐行处理,readline 运算符<$fh>就足够了。

于 2013-07-17T10:36:19.913 回答
2

默认情况下,Perl 中的所有 I/O 操作都是缓冲的。缓冲使 I/O 操作的吞吐量最大化。除非您需要特殊处理,否则不要乱用它,因为更改默认值会减慢您的程序。

于 2013-07-17T12:42:51.707 回答