Perl New Line分隔符问题

时间:2012-07-09 08:47:30

标签: perl newline

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

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

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

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

此处有人可以提出可行的解决方案吗?

我在Windows上使用Activestate Perl。

3 个答案:

答案 0 :(得分:11)

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

binmode($in);

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

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

迎接,马蒂亚斯

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

答案 1 :(得分:4)

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

  

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

答案 2 :(得分:3)

之前尝试此操作
binmode($in);