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