从输入文件开始,如下所示:
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的一部分。我不知道为什么。
答案 0 :(得分:1)
:crlf PerlIO层有两个效果:
在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//;