【问题标题】:Perl New Line separator issuePerl 换行符问题
【发布时间】:2012-07-09 17:37:22
【问题描述】:

我有一个使用 CR/LF 分隔记录的文件,但个别记录有时包含 LF。

while (<$in>)
{ 
    #extract record data
}

我正在尝试按上述方式阅读此代码,并且(如我所料)拆分仅包含 LF 的记录。但是,我希望重新分配的 $/ 可以解决此问题,但它似乎确实会导致我在一次迭代中读取完整的文件。

$/ = "\r\n";
while (<$in>)
{ 
    #extract record data
}

这里有人可以提出可行的解决方案吗?

我在 Windows 上使用 Activestate Perl。

【问题讨论】:

    标签: perl newline


    【解决方案1】:

    在 Windows 上,perl 仅将传入的 CRLF 行结尾转换为 LF,通过将数据作为文本读取 (perlport) 来区分 CRLF 和 LF 是不可能的。因此,您必须在文件句柄上使用binmode 以二进制模式读取数据:

    binmode($in);
    

    之后,您可以将输入记录分隔符设置为“\015\012”并照常读入您的记录:

    $/ = "\015\012";
    while (<$in>) {
        ...
    }
    

    你好,马蒂亚斯

    PS:目前我没有机会在本地测试它,所以如果它不起作用,我很遗憾。

    【讨论】:

      【解决方案2】:

      尝试将$/ 设置为"\n"。来自Newlines in perlport

      Perl 使用\n 来表示“逻辑”换行符,其中什么是合乎逻辑的 可能取决于使用的平台。在 MacPerl 中,\n 总是意味着 \015。 在 DOSish perls 中,\n 通常表示 \012,但在访问文件时 “文本”模式,perl 使用:crlf 层将其转换为(或从) \015\012,取决于您是在阅读还是在写作。

      【讨论】:

        【解决方案3】:

        在此之前尝试一下

        binmode($in);
        

        【讨论】:

          猜你喜欢
          • 2015-10-11
          • 2014-06-12
          • 2011-08-25
          • 1970-01-01
          • 1970-01-01
          • 2011-08-02
          • 2015-04-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多