我试图读取仅具有Cr作为行定界符的文件。我使用的是Mac OS X和Perl v.5.8.8。该脚本应该在每个平台上运行时,用于每一种行定界符(CR,LF,CRLF)的

我当前的代码是下面的:

open(FILE, "test.txt");

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

close(TEST);

此目前只打印的最后一行(或最差)。到底是怎么回事? Obvisously,我想不转换的文件。这可能吗?

有帮助吗?

解决方案

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

local $/ = "\r" # CR, use "\r\n" for CRLF or "\n" for LF
my $line = <FILE>;

请参阅的perldoc perlvar 获得进一步的信息。

另一种解决方案,它与各种换行符的作品将发出声音整个文件一次,然后将其分割成使用正则表达式行:

local $/ = undef;
my $content = <FILE>;
my @lines = split /\r\n|\n|\r/, $content;

您不应该做的非常大的文件虽然作为文件读入内存完全。请注意,设置$ /到未定义值禁用行分隔符,这意味着一切都读到文件的结尾。

其他提示

我解决这可能是有用这里一个更一般的问题:

如何分析文件大线由行与任何行定界符(CR / CRLF / LF),但预先未知。

“大”文件的装置,它不是确定整个文件读入一个变量。这里的功能“detectEndOfLine”获取文件,并传回或“\ n”的“\ r”的名字,无论是用于行结束(它搜索“\ r”或“\ n”符号字符逐个字符从开始该文件结束)。

my $file = "test.txt";
local $/ = detectEndOfLine($file);
open(IN, $file) or die "Can't open file \"$file\" for reading: $!\n";
while(<IN>) {
    s/\r\n|\n|\r$//;
    print "$_\n";
}

sub detectEndOfLine {
    my $file = $_[0];
    my $size = -s $file;
    print "\"$size\"\n";

    open(IN, $file) or die "Can't open file \"$file\" for reading: $!\n";
    for(my $i = $size; $i >= 0; --$i) {
        seek(IN, $i, 0);
        $_ = <IN>;
        my $sym = substr($_, 0, 1);
        return $sym if( $sym eq "\n" or $sym eq "\r" );
    }
    return undef;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top