我使用以下代码使用Perl脚本删除输入文件中可能的Windows换行符:
foreach my $line(split /\r|\R/)
在两台不同的Linux机器上执行相同的脚本会产生不同的结果。在machine1脚本上按预期工作,每次在资本" R"找到字符行被拆分,结果混乱。
我想知道\R
正则表达式是否正确以及如何使machine2按预期运行。
答案 0 :(得分:6)
在Perl中,可以处理回车的方式有几点不同:
\n matches a line-feed (newline) character (ASCII 10)
\r matches a carriage return (ASCII 13)
\R matches any Unicode newline sequence; can be modified using verbs
Windows使用两个字符ASCII 13
+ ASCII 10
(\r\n
),而unix使用ASCII 10
(\n
)。 \R
表达式匹配任何Unicode换行符序列\r
,\n
,\r\n
)。
\R
在一台计算机上运行而不在另一台计算机上运行的可能原因可能是Perl
的不同版本。 \R
中引入了perl 5.10.0
,因此如果其他计算机使用的是旧版本,则更新可以解决您的问题。
更多信息:
答案 1 :(得分:3)
你的一台机器必须使用相当古老的Perl版本。
5.8:
$ perl -wle'print for split /\R/, "QRS\r\nTUV\r\n";'
Unrecognized escape \R passed through at -e line 1.
Q
S
TUV
5.10:
$ perl -wle'print for split /\R/, "QRS\r\nTUV\r\n";'
QRS
TUV
始终使用use strict; use warnings;
!
备选方案:
split /[\r\n]/
。这相当于你正在使用的东西,但它可能是错误的。split /\n|\r\n?/
。这相当于split /\R/
。split /\r?\n/
。这与unix和Windows行结尾相匹配。split /\r\n/
。这与Windows行结尾相匹配。我使用倒数第二个。
答案 2 :(得分:0)