2012-07-09 89 views
8

我有一個使用CR/LF來分隔記錄的文件,但是單個記錄有時包含一個LF。Perl新行分隔符問題

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

我想讀取上面的代碼,並且這個(正如我所預期的那樣)將只包含LF的記錄拆分。然而,我會預期重新分配的$/可以解決這個問題,但它似乎會導致整個文件在一次迭代中讀取。

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

這裏的任何人誰可以建議一個工作解決方案?

我在Windows上使用Activestate Perl。

回答

3

嘗試在此之前,同時

binmode($in); 
4

嘗試設置$/"\n"。從Newlines in perlport

Perl使用\n代表「邏輯」換行,哪裏是什麼邏輯 可能取決於所使用的平臺上。在MacPerl中,\n總是表示\015。 在DOSish皮爾斯,\n通常意味着\012,但在 「文本」模式訪問文件時,Perl使用:crlf層,它轉化爲(或) \015\012,這取決於你正在閱讀或書寫。

10

在Windows中,perl的將輸入的CRLF行結束只爲LF,在數據讀取文本(perlport)作出CRLF和LF不可能區分。因此,你有你的文件句柄使用binmode以二進制方式讀取數據:

binmode($in); 

之後,你可以設置輸入記錄分隔符爲「\ 015 \ 012」和讀你的記錄爲平時:

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

映入眼簾,馬蒂亞斯

PS:我沒有機會來測試本地,此刻,如果它不工作,我很遺憾。

+0

非常感謝! – Hans 2012-07-09 10:05:31