【问题标题】:How to use SCALAR to read line-by-line after reading in a large file (Perl) ?读取大文件(Perl)后如何使用 SCALAR 逐行读取?
【发布时间】:2014-04-04 23:42:39
【问题描述】:

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

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

我不确定如何看待“新”$buffer/SCALAR 类型。它是一个字符串吗?数组?如何逐行遍历?

【问题讨论】:

    标签: perl text-files readfile scalar


    【解决方案1】:

    首先,我建议您使用以下方式读取文件:

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

    【讨论】:

      【解决方案2】:
      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);
      

      【讨论】:

      • split(/\n/, $buffer) 将删除尾随的空行,但这可能不是一件坏事。
      【解决方案3】:

      在 Perl 程序中看到read 是不寻常的。大多数情况下,readline FILE(或等效的&lt;FILE&gt;)更合适。

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

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

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

      my @lines = <FILE>;
      

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-12
        相关资源
        最近更新 更多