Perl New Line分隔符问题

Han*_*ans 8 perl newline

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

while (<$in>)
{ 
    #extract record data
}
Run Code Online (Sandbox Code Playgroud)

我试图阅读上面的代码,这(正如我所料)分割只包含LF的记录.但是我希望重新分配$/可以解决这个问题,但它确实会导致我在一次迭代中读取完整的文件.

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

这里的任何人都可以提出有效的解决方案

我在Windows上使用Activestate Perl.

Mat*_*ias 11

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

binmode($in);
Run Code Online (Sandbox Code Playgroud)

之后,您可以将输入记录分隔符设置为"\ 015\012"并像往常一样读入记录:

$/ = "\015\012";
while (<$in>) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

招呼,马蒂亚斯

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


Eug*_*ash 5

尝试设置$/"\n"。从perlport 中的换行符

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


Nah*_*eul 3

之前试试这个

binmode($in);
Run Code Online (Sandbox Code Playgroud)