perl v24

时间:2017-04-01 16:30:55

标签: perl

perlre说:

  

P

     

保留匹配的字符串,以便$ {^ PREMATCH},$ {^ MATCH}和   匹配后可以使用$ {^ POSTMATCH}。

     

在Perl 5.20及更高版本中,这将被忽略。由于新的写时复制   机制,$ {^ PREMATCH},$ {^ MATCH}和$ {^ POSTMATCH}将是   无论修饰符如何,匹配后都可用。

也是perlvar

  

$ {^ MATCH}   这类似于$& ($ MATCH),但不会招致   与该变量相关的性能损失。

     

在Perl v5.18及更早版本中,它只保证返回一个已定义的   使用/ p修饰符编译或执行模式时的值。   在Perl v5.20中,/ p修饰符不执行任何操作,因此$ {^ MATCH}与$ MATCH完全相同。

试验:

echo 'Lorem ipsum dolor sit ut dicta qui dolores.' |\
 perl -nE 'say ${^MATCH} while m/dolor/g'

输出:两个空行(2x \n

但是:

echo 'Lorem ipsum dolor sit ut dicta qui dolores.' |\
 perl -nE 'say ${^MATCH} while m/dolor/gp'

输出:

dolor
dolor

我的perl:

$ perl -v

This is perl 5, version 24, subversion 0 (v5.24.0) built for darwin-2level
(with 1 registered patch, see perl -V for more detail)

那么在5.24.0中仍然需要/p修饰符?或者我错过了什么?

1 个答案:

答案 0 :(得分:6)

代码的行为与记录的行为之间确实存在差异。将错误报告归档为RT#131087

作为解决方法,您可以使用$&$MATCH)。