我正在维护一个Perl脚本(Linux上的Perl 5.10),它需要逐行处理文件,同时尽可能灵活地处理行分隔符。任何新行和/或回车字符序列都应标记一行的结尾。文件中的空行不重要。例如,所有这些都应该产生两行:
FOO\nBAR FOO\rBAR
FOO\r\nBAR FOO\n\rBAR
FOO\r\n\r\r\r\n\n\nBAR
看起来似乎不可能通过PerlIO
或设置$/
来获取此行为。文件不大,所以我想我可以将整个文件读入内存,然后用正则表达式拆分。在Perl中有更聪明的方法吗?
答案 0 :(得分:3)
只需啜饮文件并使用split
:
use strict;
use warnings;
use autodie;
use Data::Dump;
my @data = (
"FOO\nBAR",
"FOO\rBAR",
"FOO\r\nBAR",
"FOO\n\rBAR",
"FOO\r\n\r\r\r\n\n\nBAR",
);
for my $filedata (@data) {
dd $filedata;
open my $fh, "<", \"$filedata";
local $/;
for my $line (split /[\n\r]+/, <$fh>) {
print " $line\n";
}
}
输出:
"FOO\nBAR"
FOO
BAR
"FOO\rBAR"
FOO
BAR
"FOO\r\nBAR"
FOO
BAR
"FOO\n\rBAR"
FOO
BAR
"FOO\r\n\r\r\r\n\n\nBAR"
FOO
BAR