读取perl中的大文件,按记录记录,使用动态记录分隔符

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函数拆分所述正则表达式.唯一的问题是文件太大而无法加载到内存中.

有什么建议?

mob*_*mob 6

对于这个特定的任务,检查你的行结尾听起来非常简单,并根据需要附加下一行:

$/ = "\n";
...
while(<$input>) {
    while( substr($_,-2) eq "\r\n" ) {
        $_ .= <$input>;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

这与用于支持许多不同编程上下文中的行继续的逻辑相同.

你是对的,你不能设置$/正则表达式.