如何判断我的perl进程是否使用了regex$PREMATCH/$MATCH/$POSTMATCH变量(或短等效变量$`/$';/$)?

如何判断我的perl进程是否使用了regex$PREMATCH/$MATCH/$POSTMATCH变量(或短等效变量$`/$';/$)?,regex,perl,Regex,Perl,我如何判断我的perl进程是否使用了regex变量$PREMATCH/$MATCH//$POSTMATCH(或短等价项$`/$) 我的perl webapp大量使用了,在某些情况下,在eval()中使用$PREMATCH/$` 我不想遍历验证器的所有200次调用来检查我是否触发了使用$`的代码路径,所以我可以在运行时检查是否有匹配变量在子进程运行时被使用 我想在子进程退出时放入一个日志处理程序,如果使用了一个匹配变量,它将warn() 我如何判断我的perl进程是否使用了regex变量$PREM

我如何判断我的perl进程是否使用了regex变量
$PREMATCH
/
$MATCH
/
/
$POSTMATCH
(或短等价项
$`
/
$

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

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

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

我如何判断我的perl进程是否使用了regex变量
$PREMATCH/$MATCH/$POSTMATCH
(或短等价物
$`/$'/$&

建议使用和,但精通正则表达式声称Devel::FindAmpersand不可靠*并建议:

$perl-MData::FormValidator-MDevel::SawAmpersand=SawAmpersand-e'warn if SawAmpersand'
警告:1号线-e出现问题。
$perl-MDevel::SawAmpersand=SawAmpersand-e'warn if SawAmpersand'
或者,使用调试符号构建perl,并使用
-Dr
运行:

$perl-Dr-MData::FormValidator-e1
...
启用$`$&$'支持。
执行。。。
$perl-Dr-e1
省略$`$&$'支持。
执行。。。
因此,只需
使用
ing Data::FormValidator就足以启用
$&
处理

如果您运行的是Perl5.20.0+,则。(Perl 5.18.0中还实现了一个部分修复。)如果不是这样,您将被性能问题困扰,但我建议您在进行任何更改之前分析应用程序,以确保正则表达式处理确实导致了问题


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

$perl-MDevel::FindAmpersand-e'$&'
在文件-e的第1行中找到了邪恶的变量$&
$perl-MDevel::FindAmpersand-e'BEGIN{$&}
另一方面,SawAmpersand没有:

$perl-MDevel::SawAmpersand=SawAmpersand-e'$&;结束{warn if sawampersand}'
警告:1号线-e出现问题。
$perl-MDevel::SawAmpersand=SawAmpersand-e'BEGIN{$&}END{warn if SawAmpersand}'
警告:1号线-e出现问题。

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

提到了这一点“Devel::NYTProf和Devel::FindAmpersand模块可以帮助您在代码中找到这些有问题的匹配变量的用法。“仅供参考,与它们相关的性能问题已在5.20.0中修复,因此您可能不必担心,这取决于您的设置。干杯!纽约警察厅发现了这个问题。webapps运行在v5.10.1和5.16.1的混合版本上,因此它们将受到match vars perf问题的影响。非常有用的信息,但可能无法澄清OP的问题。我认为混淆之处在于OP认为在第一次运行时使用
$&
和朋友之后性能会受到影响,而实际上
PL\u sawampersand
是在第一次编译代码时设置的,其中提到
$&
和朋友,这意味着一旦加载FormValidator,不管这些方法是否被调用。@hobbs说得好,我被细节迷住了。我明天会尽力澄清。同时,您的评论将是一个很好的答案。我不确定Data::FormValidator::Result是否会在运行时打开性能影响,因为我最初在文件中看到的$和$`位于一个带引号的字符串中,该字符串可以选择稍后进行eval()编辑。这(非常清楚且有用)答案显示它是在编译时发生的,所以我再次查看,并在常规代码中发现了另一个$&代码。出于我的目的,在我不使用FormValidator对变量进行反着色的情况下,我想我只会在结果中找出一行有问题的行。pm@hobbs “OP认为在第一次运行时使用
$&
和朋友后,性能会受到影响,而实际上
PL_sawampersand
是在第一次编译代码时设置的,其中提到
$&
和朋友“我认为在字符串
eval
perl-MDevel::SawAmpersand=SawAmpersand-e'BEGIN{sub foo{eval q{$&};}}警告if SawAmpersand()”
的情况下,OP是正确的。如果从未调用
foo()
,则不会运行
eval
,因此不会设置
PL\u sawampersand