Perl行尾解析差异

时间:2014-12-16 03:05:00

标签: perl parsing newline

来自相对perl新手的TIA。我正在做一些输入文件的解析,并遇到一个问题,在不同的Linux盒子上解析是不同的,我不知道为什么。我一次解析一行,并试图在行的末尾挑选一个变量。在一种情况下,解析器会收回回车,而在其他情况下则没有。

从输入文件开始,如下所示:

This is line one
This is line two

..这样每行最后都有CR和LF,因此文件的内容是:

54 68 69 73 20 69 73 20 6C 69 6E 65 20 6F 6E 65 0D 0A
54 68 69 73 20 69 73 20 6C 69 6E 65 20 74 77 6F 0D 0A

当我在文件上运行此代码时:

open (INPUTFILEHANDLE, "<perlin.txt") || die "Could not open for read\n";
my $txtin = <INPUTFILEHANDLE>;
my $linelen = length($txtin);
($num) = ($txtin =~ /This is line (.*)/);
print "linelen: $linelen, num: $num\n";
my $txtin = <INPUTFILEHANDLE>;
my $linelen = length($txtin);
($num) = ($txtin =~ /This is line (.*)/);
print "linelen: $linelen, num: $num\n";

在某些系统上,结果是:

linelen: 17, num: one
linelen: 17, num: two

在其他系统上(相同的perl版本5.10.1),结果是:

linelen: 18, num: one

linelen: 18, num: two

(行长是一个额外的,并且有一个回车包含在$ num变量中)

因此在某些系统中输入同时接收CR和LF,然后解析函数将CR作为通配符分配到$ num的一部分,而在其他系统中,输入仅获取CR,不是LF,因此解析函数没有将CR作为通配符赋值给$ num的一部分。我不知道为什么。

1 个答案:

答案 0 :(得分:1)

:crlf PerlIO层有两个效果:

  • 从带有:crlf的句柄读取时,CRLF被翻译为LF。
  • 当写入句柄时:crlf,LF被翻译为CRLF

在Windows版本中,:crlf PerlIO图层会自动添加到所有文件句柄中。线路长度为17的系统上的句柄具有:crlf层,因此系统必须是Windows系统。

在其他系统上,默认情况下不使用:crlf PerlIO层。系统上的行长度为18的句柄没有:crlf层,因此系统必须是非Windows系统。 (这包括在unix仿真环境中编译的Perg和其他构建的Cygwin构建。)

强迫:crlf无法添加:

open(my $fh, '<:raw', $qfn) or die $!;

强迫:crlf无法添加:

open(my $fh, '<', $qfn) or die $!;
binmode($fh);

强迫:crlf加入:

open(my $fh, '<:crlf', $qfn) or die $!;
binmode($fh);

如果你只是阅读,你也可以同时处理CRLF和LF。您可以使用以下内容代替chomp

s/\r?\n\z//;

以下情况甚至更好(因为它也消除了尾随其他空格):

s/\s+\z//;