我正在尝试将循环中的某些文本与变量中保存的正则表达式进行匹配。
添加use re 'debug';
我在第一次尝试时就看到了
Compiling REx "^(dev|demo|stg[12])$"
Final program:
1: SBOL /^/ (2)
2: OPEN1 (4)
4: TRIE-EXACT[ds] (24)
<dev> (24)
<demo> (24)
<stg> (13)
13: ANYOF[12] (24)
24: CLOSE1 (26)
26: SEOL (27)
27: END (0)
floating ""$ at 3..4 (checking floating) anchored(SBOL) minlen 3
Matching REx "^(dev|demo|stg[12])$" against "stg1"
,这是第二次尝试。变量的regex值在此循环迭代中未更改。
Compiling REx "^(dev|demo|stg[12])$"
Matching REx "^(dev|demo|stg[12])$" against "stg1"
这是否意味着它第二次重新编译?还是说它会第二次编译但没有,并且正在重新使用已经编译过的代码?
谢谢
发布此问题后,我发现了这个Does perl cache regex generation?
因此,看起来上述第二次尝试是缓存命中(即未重新编译)。我的理解正确吗?
还添加了代码示例,这是在for循环中完成的简单匹配
for my $dbrow (@dbrows)
{
if ($dbrow->[$DB_ENV] =~ /$policy->[$PC_ENV]/
$policy->[$PC_ENV]
是一个正则表达式
$policy->[$PC_ENV]
的值在此循环中未更改。
$dbrow->[$DB_ENV]
的值正在改变
起初,我认为perl会在每次迭代中重新编译$policy->[$PC_ENV]
,因为我看到每次迭代的Compiling
行(这并不是我期望的值不变),但是后来我注意到它只说Compiling
,但是可能会在它的缓存中找到它,因为它没有说Final program:
等
答案 0 :(得分:4)
是的,它避免了第二次编译。作为您的问题的结果,Perl 5.32将有一行额外的调试输出,以指示编译实际上并未完成。