regex - 我如何判断我的 perl 进程是否使用了正则表达式 $PREMATCH/$MATCH/$POSTMATCH 变量(或短的等价物 $`/$'/$&)?

标签 regex perl

我如何判断我的 perl 进程是否使用了正则表达式变量 $PREMATCH/$MATCH/$POSTMATCH(或简短的等效项$`/$'/$&)?

我的 perl webapp 大量使用了 Data::FormValidator::Results ,在某些情况下,它在 eval() 中使用 $PREMATCH/$`

我不想遍历验证器的所有 200 次调用来检查我是否触发了使用 $` 的代码路径,所以有什么我可以在运行时检查以查看是否有任何子进程运行时是否使用了匹配变量?

我想在子进程退出时放入一个日志记录处理程序,如果使用了其中一个匹配变量,它会warn()

最佳答案

How can I tell if my perl process has used the regex vars $PREMATCH/$MATCH/$POSTMATCH (or the short equivalents $`/$'/$&)?

perlvar建议使用 Devel::NYTProfDevel::FindAmpersand , 但 掌握正则表达式 声称 Devel::FindAmpersand 不可靠* 并推荐 Devel::SawAmpersand相反:

$ perl -MData::FormValidator -MDevel::SawAmpersand=sawampersand -e'warn if sawampersand'
Warning: something's wrong at -e line 1.
$ perl -MDevel::SawAmpersand=sawampersand -e'warn if sawampersand'

或者,使用调试符号构建 perl 并使用 -Dr 运行:

$ perl -Dr -MData::FormValidator -e1
...
Enabling $` $& $' support.

EXECUTING...

$ perl -Dr -e1
Omitting $` $& $' support.

EXECUTING...

因此,只需使用ing Data::FormValidator 就足以启用$& 处理。

如果您运行的是 Perl 5.20.0+,performance issues associated with $& and friends have been fixed . (在 Perl 5.18.0 中也实现了部分修复。)如果没有,您将陷入性能下降的困境,但我建议您分析您的应用程序以确保在进行任何更改之前正则表达式处理确实导致了问题。


* 作者没有细说,但是我发现 Devel::FindAmpersand 忽略了 BEGIN block 的内容:

$ perl -MDevel::FindAmpersand -e'$&'
Found evil variable $& in file -e, line 1
$ perl -MDevel::FindAmpersand -e'BEGIN { $& }'

另一方面,Devel::SawAmpersand 不会:

$ perl -MDevel::SawAmpersand=sawampersand -e'$&; END { warn if sawampersand }'
Warning: something's wrong at -e line 1.
$ perl -MDevel::SawAmpersand=sawampersand -e'BEGIN { $& } END { warn if sawampersand }'
Warning: something's wrong at -e line 1.

Devel::FindAmpersand 使用 B 模块遍历 optree 并将变量名与正则表达式进行比较,而 Devel::SawAmpersand 使用 XS 代码直接检查 PL_sawampersand 变量,我认为这解释了区别。

关于regex - 我如何判断我的 perl 进程是否使用了正则表达式 $PREMATCH/$MATCH/$POSTMATCH 变量(或短的等价物 $`/$'/$&)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33878100/

相关文章:

Perl命令行输入参数

perl - 如何在我的 Heroku/Perl Web 应用程序中使用自定义模块?

java - 如何编写正则表达式来分割这种格式的字符串?

perl - Perl 中的递归 grep

java - 如何从管道分隔的键/值列表中检索值?

java - 从较大的字符串中提取包含通配符的字符串

Perl Text::Unaccent 有意想不到的结果

linux - 从 Linux 终端运行 PERL 脚本时保留重音字母

regex - 如何使用正则表达式和 sed (或等效的 unix 命令行工具)来修复 LaTeX 标题中的标题大小写?

javascript - RegExp 替换在再次替换时导致错误结果