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