gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:20:30 26 4
gpt4 key购买 nike

我如何判断我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com