Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让perl-c抛出未定义或未声明的函数错误? 来自C++背景,我虔诚地使用使用严格的< /代码>和代码>使用Perl:的警告< /代码>特性。 #!/usr/bin/perl -w use strict; use warnings; $foo = 1; #Throws "$foo" requires explicit package name error foobar( 1 );_Perl - Fatal编程技术网

如何让perl-c抛出未定义或未声明的函数错误? 来自C++背景,我虔诚地使用使用严格的< /代码>和代码>使用Perl:的警告< /代码>特性。 #!/usr/bin/perl -w use strict; use warnings; $foo = 1; #Throws "$foo" requires explicit package name error foobar( 1 );

如何让perl-c抛出未定义或未声明的函数错误? 来自C++背景,我虔诚地使用使用严格的< /代码>和代码>使用Perl:的警告< /代码>特性。 #!/usr/bin/perl -w use strict; use warnings; $foo = 1; #Throws "$foo" requires explicit package name error foobar( 1 );,perl,Perl,use strict结构非常有助于在错误键入变量名时捕获错误。是否有一个等价的构造来捕获输入错误的函数名?在上面的示例中,如果有类似于perl-c的东西发现没有可调用的foobar函数,那就太好了。当然,运行脚本会抛出一个未定义的子例程错误,但我希望更快地捕获它。尝试以下方法: perl -MO=Lint -cw /path/to/script.pl 这使用了。Perl不可能在编译时知道一旦到达子调用,就不会有子调用,因此-c不可能告诉您这一点 是一个用来扫描Perl代码并猜测可能出现的问题的

use strict
结构非常有助于在错误键入变量名时捕获错误。是否有一个等价的构造来捕获输入错误的函数名?在上面的示例中,如果有类似于
perl-c
的东西发现没有可调用的foobar函数,那就太好了。当然,运行脚本会抛出一个未定义的子例程错误,但我希望更快地捕获它。

尝试以下方法:

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

这使用了。

Perl不可能在编译时知道一旦到达子调用,就不会有子调用,因此
-c
不可能告诉您这一点


是一个用来扫描Perl代码并猜测可能出现的问题的工具。Perl::Critic::StriterSubs
perlcritic
规则检查此问题。

看到ikegami的答案提醒我,可以识别未声明的Sub,但您需要安装策略,它不是核心
Perl::Critic
发行版的一部分

perlcritic-4 mycode.pl

子例程“foobar”既没有声明也没有显式导入 第10行第1列。这可能是一个主要的错误。(严重程度:4)

该模块完成您正在寻找的功能,并且具有词法范围

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

具体而言,在启用检查的情况下,对特定 (编译时常量)检查基于包的子例程名称。如果 指定的子例程从未声明过,则会出现错误 在编译时发出信号。这并不要求子例程 完全定义:一个转发声明,如“sub foo;”就足以 抑制错误。导入的子例程符合声明的条件。 选中的引用不仅包括子例程调用,还包括 纯引用,如“\&foo”

此检查由词汇范围的杂注控制。它是 因此,仅应用于显式需要检查的代码,并且 如有必要,可以在本地禁用检查。检查 可能需要关闭进行特殊安排的代码 例如,在运行时放置一个子例程