我解决了,可能是这里有用的一个更一般的问题:
如何分析大文件中的行由行与任何行分隔符(CR/CRLF/LF),但事先未知。
'Big'文件意味着将整个文件读入一个变量是不行的。这里函数'detectEndOfLine'获取文件的名称并返回'\ r'或'\ n',无论用于行结束符(从\ n开始搜索'\ r'或'\ n'符号char-by-char文件结尾)。
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;
}
我会很烦人,并建议您使用'strict'和'warnings'编译指示,它们会为您节省数小时的调试时间。另外,最好使用带词法文件句柄的现代3参数形式。有关更多信息,请参阅http://stackoverflow.com/questions/1479741/why-is-three-argument-open-calls-with-lexical-filehandles-a-perl-best-practice。 – daotoad 2010-06-10 22:32:06
@daotoad谢谢 – subb 2010-06-29 12:27:58