perl v24中的$ {^ MATCH}和/ p修饰符

kob*_*ame 6 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'
Run Code Online (Sandbox Code Playgroud)

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

但是:

echo 'Lorem ipsum dolor sit ut dicta qui dolores.' |\
 perl -nE 'say ${^MATCH} while m/dolor/gp'
Run Code Online (Sandbox Code Playgroud)

输出:

dolor
dolor
Run Code Online (Sandbox Code Playgroud)

我的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)
Run Code Online (Sandbox Code Playgroud)

因此,在5.24.0/p修改仍然需要?或者我错过了什么?

ike*_*ami 6

代码的行为与记录的行为之间确实存在差异.提交错误报告作为机票RT#131087.

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