以下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都没有意义。
.
匹配\n
也是。 你的正则表达式不包含.
\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 }