我有一个使用CR / LF分隔记录的文件,但个别记录有时包含LF。
while (<$in>)
{
#extract record data
}
我正在尝试如上所述读取此代码,并且(正如我所料)将仅包含LF的记录拆分。但是我希望重新分配$/
可以解决这个问题,但它确实会导致我在一次迭代中读取完整的文件。
$/ = "\r\n";
while (<$in>)
{
#extract record data
}
此处有人可以提出可行的解决方案吗?
我在Windows上使用Activestate Perl。
答案 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);