- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我如何判断我的 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::NYTProf和 Devel::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/
有没有办法从 pcrecpp 获得 Perl 的 PREMATCH ($`) 和 POSTMATCH ($') 的 C++ 等价物?我会对指向此处的字符串、char * 或成对的 indices/st
我如何判断我的 perl 进程是否使用了正则表达式变量 $PREMATCH/$MATCH/$POSTMATCH(或简短的等效项$`/$'/$&)? 我的 perl webapp 大量使用了 Data:
我是一名优秀的程序员,十分优秀!