Perl浅语法检查?即.不检查导入的语法

Dal*_*ter 8 syntax perl lint

如何对perl文件执行"浅层"语法检查.该标准perl -c很有用,但它会检查导入的语法.当您在代码存储库中工作并推送到正在运行的环境并且您在存储库中定义了一个但尚未推送到运行环境的函数时,这有时很好但不是很好.它无法检查函数,因为导入引用系统路径(即使用Custom :: Project :: Lib qw(foo bar baz)).

hob*_*bbs 11

它实际上无法完成,因为导入能够影响后面代码的解析.例如use strict使得它使得裸字不被解析为字符串(和改变用于名称如何变量可使用的规则),use constant导致要定义的常数潜艇,和use Try::Tiny改变表达式的涉及解析try,catchfinally(通过给他们&原型) .更一般地说,任何将任何内容导出到调用者命名空间的模块都会影响解析,因为当名称引用现有子例程时,perl解析器会以不同的方式解决歧义,而不是.


DVK*_*DVK 8

这有两个问题:

  1. -c如果缺少所需的模块,如何不失败?

    有两种解决方案:

    A.在生产中添加假/存根模块

    B.在所有模块中,使用一个特殊的全部@INC子例程条目(在此处@INC解释使用subs ).这显然存在一个问题,即如果缺少库,模块在实际生产运行时不会失败 - 我的书中的DoublePlusNotGood.

  2. 即使您可以以某种方式跳过丢失模块的失败,您仍然会在使用从丢失模块导入的标识符或从该模块的命名空间显式使用时失败.

    唯一可行的解​​决方案是回到#1a并使用假存根模块,但这次是为每个公共接口都有一个声明的和(根据需要)导出的标识符.例如do-nothing sub或dummy变量.

    但是,即使这样也会失败一些高级模块,这些模块动态地确定在自己的命名空间中创建什么以及在运行时导出什么(并且调用者代码可以动态地确定要调用哪些子节点 - heck,有时候导入哪些模块).

    但是这种方法适用于普通的"Java/C-like"OO或只能调用静态命名的预定义公共子,方法和访问导出变量的过程代码.