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

时间:2011-12-14 04:49:26

标签: perl

来自C ++背景,我虔诚地使用Perl的use strictuse warnings功能:

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

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

foobar( 1 );  

use strict构造对于错误输入变量名称时捕获错误非常有帮助。是否有一个等效的构造来捕获错误的函数名称?在上面的示例中,如果有perl -c之类的内容可以捕获到没有 foobar 函数可以调用的事实,那就太棒了。当然,运行脚本会抛出 Undefined subroutine 错误,但我想早点抓住它。

4 个答案:

答案 0 :(得分:13)

试试这个:

perl -MO=Lint -cw /path/to/script.pl

这使用B::Lint module

答案 1 :(得分:7)

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

  

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

     

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

     

此检查由词法范围的pragma控制。它是   因此仅适用于明确要检查的代码,以及   如有必要,可以在本地禁用检查。检查   可能需要关闭进行特殊安排的代码   例如,在运行时放置一个子程序。

答案 2 :(得分:6)

看到ikegami的答案提醒我perlcritic可以识别未声明的潜在客户,但您需要安装Perl::Critic::StricterSubs政策,该政策不属于核心Perl::Critic分布。

  

perlcritic -4 mycode.pl

     

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

答案 3 :(得分:2)

Perl在编译时不可能知道一旦达到子调用就没有子调用,所以-c不可能告诉你。

perlcritic是一个用于扫描Perl代码和猜测的工具,可能出现类似这样的问题。 Perl :: Critic :: StricterSubs perlcritic规则检查此问题。