PerlCritic提示require用裸字却报错,是否为PerlCritic的Bug?
问题解析与结论
这不是PerlCritic的Bug,而是规则适用场景的问题。
为什么改成
require bin/menu.pl会报错?
Perl里的裸词写法bin/menu.pl会被解析为bin / menu . pl——也就是把bin当作未定义变量(默认值为0),然后执行除法运算0除以menu(同样是未定义变量,值为0),自然触发“非法除零”错误。裸词形式的require只适用于模块名(比如require Foo::Bar),Perl会自动把模块名转换成对应的文件路径(Foo/Bar.pm),再去@INC目录里查找。Perl官方文档为什么建议用字符串形式?
当你要require的是带路径的脚本文件(比如bin/menu.pl),或者非模块格式的文件时,必须用字符串形式。因为只有字符串形式的require才会直接按给定的路径去加载文件,不会做模块名到路径的转换。PerlCritic的提示是什么情况?
PerlCritic的ProhibitStringyRequire规则是用来规范模块加载的——要求加载标准模块或自定义模块时用裸词形式,避免字符串带来的安全风险或路径问题。但这个规则不适用于加载带路径的脚本文件,这时候你需要手动忽略这个提示:
在代码行上方加注释:## no critic (ProhibitStringyRequire),或者在PerlCritic的配置文件中针对这类场景禁用该规则。
内容的提问来源于stack exchange,提问作者turtle
相关产品推荐
相关产品推荐

