\ r或\ n的任何序列作为行分隔符?

时间:2014-06-30 21:27:08

标签: perl

我正在维护一个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中有更聪明的方法吗?

1 个答案:

答案 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