来自C ++背景,我虔诚地使用Perl的use strict
和use 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 错误,但我想早点抓住它。
答案 0 :(得分:13)
答案 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
规则检查此问题。