不同PERL对垂直标签的不同处理

不同PERL对垂直标签的不同处理,perl,Perl,我有两个Perl程序,它们使用相同的库来处理文档。它们安装在两台不同的服务器上,一台运行Perl5.12,另一台运行Perl5.18 现在,我将相同的文件作为输入提供给两者,因此我可以区分输出以确保它们匹配。我找到了数百个相同的匹配项。他们通常在处理UTF-8文件,我已经注意正确处理了这种编码 今天,他们都收到了一个二进制文件,我第一次看到了不同。我确定有一个程序(运行Perl5.18的程序)在输出文件内容之前从文件内容中剥离垂直选项卡,而另一个程序没有 我可以把它写成不支持二进制文件,但它们是

我有两个Perl程序,它们使用相同的库来处理文档。它们安装在两台不同的服务器上,一台运行Perl5.12,另一台运行Perl5.18

现在,我将相同的文件作为输入提供给两者,因此我可以区分输出以确保它们匹配。我找到了数百个相同的匹配项。他们通常在处理UTF-8文件,我已经注意正确处理了这种编码

今天,他们都收到了一个二进制文件,我第一次看到了不同。我确定有一个程序(运行Perl5.18的程序)在输出文件内容之前从文件内容中剥离垂直选项卡,而另一个程序没有

我可以把它写成不支持二进制文件,但它们是不同的,这仍然困扰着我。我查看了进行处理的库,它包含这一行(它将以这种方式处理文件中的每一行):

有没有可能一个perl认为垂直标签是空格,而另一个不认为?我该怎么检查呢?还有什么你认为我应该调查的吗?

从5.18开始

没有人能回忆起为什么
\s
与垂直选项卡
\cK
不匹配。现在是了。鉴于这种性格极为罕见,预计很少有破损。也就是说,这意味着:

正则表达式中的
\s
现在在所有情况下都与垂直选项卡匹配

使用
/x
修饰符时,将忽略正则表达式文字中的文字垂直选项卡

现在,在将字符串解释为数字时,将忽略前导垂直制表符(单独或与其他空格混合)。例如:

$dec = " \cK \t 123";
$hex = " \cK \t 0xF";
say 0 + $dec;   # was 0 with warning, now 123
say int $dec;   # was 0, now 123
say oct $hex;   # was 0, now  15
这使Perl与一致,它认为U+000B行制表法又称垂直制表法,又称VT a
White\U Space
字符


您可以通过将
\s
替换为
[^\s\x0B]
来恢复旧的行为

同样值得考虑的是
\h
,它只匹配水平空白字符

U+0009字符表,由\s&\h匹配
U+000A换行符与\s&\v匹配
由\s&\v匹配的U+000B行列表
U+000C表单馈送由\s&\v匹配
U+000D回车符与\s&\v匹配
U+0020空间由\s&\h匹配
U+0085下一行由\s&\v匹配
U+00A0不间断空间由\s&\h匹配
U+1680 OGHAM空格标记与\s&\h匹配
U+2000四元组由\s和\h匹配
U+2001 EM四元组由\s和\h匹配
U+2002 EN空间由\s&\h匹配
U+2003 EM空间由\s&\h匹配
U+2004每EM三个空间由\s&\h匹配
U+2005每EM四个空间由\s&\h匹配
U+2006每EM 6个空间匹配\s&\h
U+2007图形空间由\s&\h匹配
U+2008标点符号空间由\s&\h匹配
U+2009精简空间由\s&\h匹配
U+200A头发空间与\s&\h匹配
U+2028行分隔符与\s&\v匹配
U+2029段落分隔符由\s&\v匹配
U+202F由\s&\h匹配的窄不间断空间
U+205F介质数学空间由\s&\h匹配
U+3000表意文字空间与\s&\h匹配
$dec = " \cK \t 123";
$hex = " \cK \t 0xF";
say 0 + $dec;   # was 0 with warning, now 123
say int $dec;   # was 0, now 123
say oct $hex;   # was 0, now  15