如何在大文件(Perl)中读取后逐行读取SCALAR?

时间:2014-03-03 19:01:14

标签: perl text-files readfile scalar

我正在使用以下内容将文件读入SCALAR

open FILE, "<", $filename or error_out("Error opening $filename");
read FILE, my $buffer, -s $filename;    
close FILE;

我不确定如何考虑“新”$buffer / SCALAR类型。它是一个字符串?数组?如何逐行完成?

3 个答案:

答案 0 :(得分:6)

首先,我建议您使用以下内容来阅读文件:

my $buffer = do {
    open(my $fh, '<', $filename)
        or error_out("Error opening $filename: $!");
    local $/;
    <$fh>
};

请注意删除无用且可能不正确的-s。注意对文件句柄使用词法变量而不是全局变量。请注意在错误消息中包含基础错误消息。


  1. 变量是标量。该值为字符串。

  2. for my $line (split(/^/m, $buffer)) {
        ...
    }
    

    但为什么不一次只读一行。

    open(my $fh, '<', $filename)
        or error_out("Error opening $filename: $!");
    
    while (my $line = <$fh>) {
        ...
    }
    

答案 1 :(得分:3)

for my $line (split(/\n/, $buffer)
{
    # do whatever with $line
}

或者,如果您没有特别依赖于将整个文件一次性读入内存:

open(FILE, "<", $filename) or error_out("Error opening $filename");

while (<FILE>)
{
    # do whatever with $_
}

close(FILE);

答案 2 :(得分:2)

在Perl程序中使用read是不常见的。大多数情况下readline FILE(或等效的<FILE>)更合适。

如果您不需要同时在内存中存储整个文件,则可以使用

迭代这些行
while (my $line = <FILE>) {
  # Process $line
}

或者如果您希望将整个文件放在一个行数组中,那么您可以执行

my @lines = <FILE>;

将整个文件读入单个字符串的常规方法是取消定义$/ - 输入文件分隔符 - 就像这样

local $/;
my $contents = <FILE>;

但这通常远比前两个选项有用。