Man*_*qui 1 perl performance file-io
我有一个逐行读取大文件的脚本.$/我想要使用的记录分隔符()是(\n).唯一的问题是每行上的数据都包含CRLF字符(\r\n),该程序不应被视为一行的结尾.
例如,这是一个示例数据文件(写出换行符和CRLF):
line1contents\n
line2contents\n
line3\r\ncontents\n
line4contents\n
Run Code Online (Sandbox Code Playgroud)
如果我设置$/ = "\n",那么它将第三行分成两行.理想情况下,我可以只设置$/到相匹配的正则表达式\n,而不是\r\n,但我不认为这是可能的.另一种可能性是读入整个文件,然后使用split函数拆分所述正则表达式.唯一的问题是文件太大而无法加载到内存中.
有什么建议?
对于这个特定的任务,检查你的行结尾听起来非常简单,并根据需要附加下一行:
$/ = "\n";
...
while(<$input>) {
while( substr($_,-2) eq "\r\n" ) {
$_ .= <$input>;
}
...
}
Run Code Online (Sandbox Code Playgroud)
这与用于支持许多不同编程上下文中的行继续的逻辑相同.
你是对的,你不能设置$/正则表达式.