Perl试图了解正则表达式调试输出

all*_*ail 5 perl

我试图匹配变量中的正则表达式匹配循环中的一些文本。

在添加 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"
Run Code Online (Sandbox Code Playgroud)

这是第二次尝试。变量的regex值在此循环迭代中未更改。

Compiling REx "^(dev|demo|stg[12])$"
Matching REx "^(dev|demo|stg[12])$" against "stg1"
Run Code Online (Sandbox Code Playgroud)

这是否意味着它会第二次重新编译?还是说它会第二次编译但没有,并且正在重用已经编译过的代码?

谢谢

发布此问题后,我发现了这个问题。Perl是否缓存正则表达式生成?

因此,看起来上面的第二次尝试是缓存命中(即,它没有重新编译)。我的理解正确吗?

同样添加代码示例,这是在for循环中完成的简单匹配

  for my $dbrow (@dbrows)
  {
    if ($dbrow->[$DB_ENV] =~ /$policy->[$PC_ENV]/
Run Code Online (Sandbox Code Playgroud)

$policy->[$PC_ENV]是正则表达式 $policy->[$PC_ENV]值在此循环中未更改。 $dbrow->[$DB_ENV]价值在变化

起初,我认为perl会$policy->[$PC_ENV]在每次迭代中重新编译,因为我看到Compiling了每次迭代的那一行(这不是我期望的值,因为它的值没有改变),但后来我注意到它只是说了一点Compiling,然后可能会在它的缓存,因为它不说Final program:

khw*_*khw 4

是的,它避免了第二次编译。由于您的问题,Perl 5.32 将有一行额外的调试输出,以表明编译实际上尚未完成。