如何逐行读取用Perl仅CR-文件?
-
26-09-2019 - |
题
我试图读取仅具有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;
}
不隶属于 StackOverflow