perl v5.24 中的 ${^MATCH} 和 /p 修饰符

问题描述 投票:0回答:1

perlre 说:

p

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

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

还有perlvar

${^比赛} 这与 $& ($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
修饰符?还是我错过了什么?

perl
1个回答
7
投票

代码的行为和记录的行为之间确实存在差异。以票证形式提交错误报告 RT#131087

作为解决方法,您可以使用

$&
(
$MATCH
)。

© www.soinside.com 2019 - 2024. All rights reserved.