代码之家  ›  专栏  ›  技术社区  ›  Tom Hale

阻止编译/linting执行BEGIN/UNITCHECK块

  •  0
  • Tom Hale  · 技术社区  · 5 年前

    我想在perl代码中检测语法错误。我发现了 perlcritic 错过了许多(如随机的) else if perl -cw 看来是唯一可行的选择。

    This perlmonks post 显示在 BEGIN , INIT , UNITCHECK ,和 CHECK 编译时可以/确实执行块。

    我能查一下语法吗 perl 不运行任何代码?

    删除或重命名可能导致执行的块怎么样?

    0 回复  |  直到 5 年前
        1
  •  2
  •   ikegami Gilles Quénot    5 年前

    perlcritic perltidy 执行他们分析/操作的任何代码。


    要正确解析Perl代码,需要执行其中的一部分。

    例如,

    BEGIN {
       if (rand() < 0.5) {
          *f = sub { 5 };
       } else {
          *f = sub() { 5 };
       }
    }
    
    print f + 2;
    

    5 7 因为最后一条语句被随机编译为以下语句之一:

    print( f( +2 ) );   # rand() >= 0.5
    
    print( f() + 2 );   # rand() < 0.5
    

    好吧,那就太牵强了。还是真的?这和

    use Module qw( f );   # No different than a BEGIN block.
    
    print f + 2;
    

    say "foo";   # This is a sub call.
    
    use feature qw( say );
    
    say "foo";   # This isn't a sub call; this is the say operator.
    

    这意味着正确解析使用 say CORE::say )需要执行代码。很多代码使用 接线员。

    但是,如果你考虑了一些常见的特殊情况,如果你接受了一定的不精确性(比如 是子呼叫还是 PPI .

    • 使用PPI。它不执行它分析的任何代码。
    • perltidy公司 使用自己的解析器。它不执行它分析的任何代码。
    • perl -c 将执行 BEGIN use 声明)等等。