如何让perl -c抛出Undefined或Undeclared函数错误?

par*_*mar 10 perl

从C++背景的,我虔诚地使用use strictuse warningsPerl的特点:

#!/usr/bin/perl -w
use strict;
use warnings;

$foo = 1; #Throws "$foo" requires explicit package name error

foobar( 1 );  
Run Code Online (Sandbox Code Playgroud)

use strict错误输入变量名称时,该构造非常有助于捕获错误.是否有一个等效的构造来捕获错误的函数名称?在上面的例子中,如果有类似的perl -c事情发现没有foob​​ar 函数可以调用那将是很好的.当然,运行脚本会抛出一个Undefined子例程错误,但我想早点抓住它.

sjs*_*sjs 13

试试这个:

perl -MO=Lint -cw /path/to/script.pl
Run Code Online (Sandbox Code Playgroud)

这使用B :: Lint模块.


Eri*_*rom 7

Sub :: StrictDecl模块可以满足您的需求,并且具有词法范围.

该模块在编译时提供子程序存在的可选检查.此检查检测程序员忘记导入的错误的子例程名称和子例程.传统上Perl直到运行时才检测到这些错误,因此很容易在很少执行或未经测试的代码中潜伏错误.

具体而言,在启用检查的情况下,将检查对特定(编译时常量)基于包的子例程名称的任何引用.如果从未声明了命名子例程,则在编译时发出错误信号.这不需要完全定义子例程:前向声明,例如"sub foo;" 足以抑制错误.导入的子例程符合声明的条件.检查的引用不仅包括子程序调用,还包括纯引用,如"\&foo".

此检查由词法范围的编译指示控制.因此,它仅应用于明确要检查的代码,并且可以在必要时在本地禁用检查.例如,可能需要关闭代码,以便进行特殊安排以在运行时将子例程放置到位.


too*_*lic 6

看到ikegami的答案提醒我,perlcritic可以识别未声明的潜艇,但你需要安装Perl :: Critic :: StricterSubs政策,这不是核心Perl::Critic发行版的一部分.

perlcritic -4 mycode.pl

子程序"foobar"既未在第10行第1列声明也未明确导入.这可能是一个主要错误.(严重程度:4)