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

7

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 修饰符吗?或者我们错过了什么?


我同意你的评估。解决方法:您可以使用 $& ($MATCH)。 - ikegami
1个回答

7

代码行为和文档记录的行为确实存在差异。已将其作为票据 RT#131087 提交了错误报告。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接