Perl的/ m正则expression式修饰符在Windows上匹配不同吗?

以下Perl语句在Unixish机器上performance相同。 他们在Windows上performance不同吗? 如果是的话,是不是因为魔法\ n?

split m/\015\012/ms, $http_msg; split m/\015\012/s, $http_msg; 

Win32烟雾testing仪的一个CPAN模块出现故障 。 它看起来像\ r \ n vs \ n问题。 我最近做的一个改变是把m添加到我的正则expression式中。

对于这些正则表达式:

 m/\015\012/ms m/\015\012/s 

/ m和/ s都没有意义。

  • / s:使. 匹配\n也是。 你的正则表达式不包含.
  • / m:在字符串中嵌入\n后面的^$匹配。 你的正则表达式不包含^$ ,或者它们的同义词。

如果您的输入句柄(套接字?)在文本模式下工作,则可能的确是在Windows上删除了\r\015 )字符。

那么该怎么办? 我建议使\015字符可选,并分裂

 /\015?\012/ 

不需要/ m,/ s甚至是前导m// 。 那些只是货物崇拜。

没有魔法\n\n\r总是表示一个字符,并且在所有基于ASCII的平台上分别是\cJ\cM 。 (除了EBCDIC平台(显而易见的原因)和MacOS Classic(其中\n\r都表示\cM ))。

在Windows上发生的奇迹是,当通过标记为文本模式的文件句柄进行I / O时, \r\n \n在读取时被翻译为\n ,反之亦然。 (另外, \cZ表示文件结束 – 意外!)这是在C运行时库层完成的。

你需要binmode你的套接字来解决这个问题。

你也应该从你的模式中删除/s/m修饰符:因为你不使用他们修改行为的元字符( .^ / $对),他们什么都不做 – 货物崇拜。

为什么要添加/m ? 你想在线分裂? 要用/m来做到这一点,你需要在正则表达式中使用^$

 my @lines = split /^/m, $big_string; 

但是,如果要将大字符串视为线条,只需在对标量的引用上打开文件句柄即可:

 open my $string_fh, '<', \ $big_string; while( <$string_fh> ) { ... process a line }