Perl行结束分析差异

Perl行结束分析差异,perl,parsing,newline,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

来自一位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";
在其他系统(相同的perl版本5.10.1)上,结果是:

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

linelen: 18, num: two
(行长度是额外的一个,并且$num变量中包含回车符)


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

crlf PerlIO层有两个效果:

  • 使用:crlf从句柄读取时,crlf被转换为LF
  • 使用:crlf写入句柄时,LF将转换为crlf
在Windows版本中,会自动将:crlf PerlIO层添加到所有文件句柄中。系统上的句柄(其中行长度为17)具有:crlf层,因此该系统必须是Windows系统

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

要强制:crlf不被添加:

open(my $fh, '<:raw', $qfn) or die $!;
open(my $fh, '<', $qfn) or die $!;
binmode($fh);
open(my $fh, '<:crlf', $qfn) or die $!;
binmode($fh);
以下内容甚至更好(因为它也去掉了尾随的其他空格):


这不是PERL独有的问题。这与文件行尾格式有关。大多数Linux机器都需要UNIX/OSX格式,而且听起来您的文件有Windows格式的EOL,因此CR和LF行中断。将所有文件EOL转换为UNIX/OSX格式,这应该可以解决问题。您说您在“某些系统”上得到一个结果,在“其他系统”上得到另一个结果。“某些系统”和“其他系统”有何不同?每个服务器上运行哪些linux发行版和版本?您是否比较了perl-V的输出?如果它都是linux,那么这听起来绝对不对……评论不适合进一步讨论;这段对话已经结束。
s/\r?\n\z//;
s/\s+\z//;