如何使用Perl逐行读取CR-only文件?

sub*_*ubb 3 perl line-breaks carriage-return readfile linefeed

我正在尝试读取只有CR作为行分隔符的文件.我正在使用Mac OS X和Perl v.5.8.8.对于每种行分隔符(CR,LF,CRLF),此脚本应在每个平台上运行.

我目前的代码如下:

open(FILE, "test.txt");

while($record = <FILE>){
    print $record;
}

close(TEST);
Run Code Online (Sandbox Code Playgroud)

目前只打印最后一行(或最差).到底是怎么回事?很明显,我想不转换文件.可能吗?

jkr*_*mer 20

您可以使用特殊变量设置分隔符$/:

local $/ = "\r" # CR, use "\r\n" for CRLF or "\n" for LF
my $line = <FILE>;
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅perldoc perlvar.

另一种适用于各种换行符的解决方案是立即对整个文件进行啜饮,然后使用正则表达式将其拆分为多行:

local $/ = undef;
my $content = <FILE>;
my @lines = split /\r\n|\n|\r/, $content;
Run Code Online (Sandbox Code Playgroud)

但是,对于非常大的文件,您不应该这样做,因为文件完全被读入内存.请注意,将$ /设置为未定义的值会禁用行分隔符,这意味着在文件结束之前一直读取所有内容.