繁体   English   中英

读取大文件(Perl)后如何使用SCALAR逐行读取?

[英]How to use SCALAR to read line-by-line after reading in a large file (Perl) ?

我正在使用以下方式将文件读入SCALAR

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

我不确定如何考虑“新的” $buffer / SCALAR类型。 是字符串吗? 数组? 如何逐行处理?

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

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>) { ... } 
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);

在Perl程序中使用read是不寻常的。 通常, readline FILE (或等效的<FILE> )更合适。

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

while (my $line = <FILE>) {
  # Process $line
}

或者,如果您希望将整个文件排列成一行,则可以

my @lines = <FILE>;

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM