8

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

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

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

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

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

我在 Windows 上使用 Activestate Perl。

4

3 回答 3

11

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

binmode($in);

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

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

问候,马蒂亚斯

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

于 2012-07-09T09:37:22.037 回答
5

尝试设置$/"\n". 来自perlport 中的换行符

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

于 2012-07-09T09:22:49.733 回答
3

在此之前尝试一下

binmode($in);
于 2012-07-09T09:24:00.703 回答