有没有人知道Perl验证器

时间:2011-02-03 18:58:04

标签: perl debugging validation

我是Perl的新手,刚刚开始使用它,最初学过JavaScript。我想知道是否有可能验证Perl代码的验证器(如JS的Firebug)。如果有人知道一个可靠的人,我将不胜感激。我用Google搜索了很多次,收效甚微,而且我们都知道学习新语言时会出现错误。提前谢谢!。

4 个答案:

答案 0 :(得分:17)

Perl本身怎么样?

perl -c your_program.pl

如果您在程序开头添加以下内容,则可以避免许多麻烦。

use strict;
use warnings;
use diagnostics;

最后,有Perl::Critic

答案 1 :(得分:7)

here is an online perl validator

如果只检查语法是否干净,可以尝试perl -c filename。要清理代码格式,您可能需要查看PerlTidy。 。 你可能不需要一个vaidator。你可以自己做点事。

重定向错误消息

默认情况下,错误消息将发送到STDERR。大多数HTTPD服务器将STDERR定向到服务器的错误日志。某些应用程序可能希望保留私有错误日志,与服务器的错误日志不同,或者他们可能希望将错误消息定向到STDOUT,以便浏览器接收它们。

为此目的提供carpout()功能。由于默认情况下不导出carpout(),因此您必须通过说

明确导出它
 use CGI::Carp qw(carpout);

carpout()函数需要一个参数,该参数应该是对用于写入错误的打开文件句柄的引用。它应该在CGI应用程序顶部的BEGIN块中调用,以便捕获编译器错误。例如:

 BEGIN {
    use CGI::Carp qw(carpout);
    open(LOG, ">>/usr/local/cgi-logs/mycgi-log") or
    die("Unable to open mycgi-log: $!\n");
    carpout(LOG);
    }
此时

carpout()不会为您处理日志上的文件锁定。另请注意,carpout()不适用于内存文件句柄,但欢迎使用补丁来解决此问题。

真正的STDERR未关闭 - 它被移动到CGI :: Carp :: SAVEERR。当脚本关闭STDOUT和STDERR时,某些服务器在处理CGI脚本时会关闭与浏览器的连接。 CGI :: Carp :: SAVEERR可以防止这种情况过早发生。

您可以通过各种方式将文件句柄传递给carpout()。 “正确”的方法可能是通过对文件句柄GLOB的引用:

carpout(* LOG);

也接受以下语法:

carpout(LOG);
carpout(main::LOG);
carpout(main'LOG);
carpout(\LOG);
carpout(\'main::LOG');
... and so on

FileHandle和其他对象也可以。

在浏览器窗口中出现PERL错误

如果要向浏览器发送致命(死亡,忏悔)错误,请要求导入特殊的“fatalsToBrowser”子例程:

 use CGI::Carp qw(fatalsToBrowser);
    die "Bad error here";

现在,致命错误将回显到浏览器以及日志。 CGI :: Carp安排向浏览器发送最小的HTTP头,以便在早期编译阶段发生错误。非致命错误仍将仅定向到日志文件(除非使用carpout重定向)。

*请注意,fatalsToBrowser不适用于mod_perl 2.0及更高版本。*

更改默认消息

默认情况下,软件错误消息后面会有一个注释,通过电子邮件与网站管理员联系,并提供错误的时间和日期。如果此消息不符合您的喜好,您可以使用set_message()例程进行更改。默认情况下不导入;你应该在use()行导入它:

use CGI::Carp qw(fatalsToBrowser set_message);
set_message("It's not a bug, it's a feature!");

您还可以传入代码引用以创建自定义错误消息。在运行时,将使用导致脚本死亡的错误消息文本调用您的代码。例如:

use CGI::Carp qw(fatalsToBrowser set_message);
BEGIN {
sub handle_errors {
my $msg = shift;
print "<h1>Oh gosh</h1>";
print "<p>Got an error: $msg</p>";
}
set_message(\&handle_errors);
}

答案 2 :(得分:6)

因为perl是一种动态语言,所以很多事情都无法验证;例如,您可以调用编译时不存在的子,因为它可以在运行时创建。静态验证器无法知道呼叫是否正确。

如果您只想知道代码是否编译,请使用perl解释器本身。

如果要检查代码是否符合给定的编码标准,请使用Perl::Critic

答案 3 :(得分:5)

有很多方法可以解决这个问题。您可以阅读http://perldoc.perl.org/perldebug.html以了解如何使用调试器,这在某些方面类似于Firebug。但是还有很多其他方法可以自动避免问题。

  1. 如果您启动代码,会自动捕获许多类常见错误     用严格;     使用警告;

  2. http://perltidy.sourceforge.net/重新格式化您的代码,并且可以轻松捕捉到许多常见错误。

  3. CPAN模块Perl :: Critic执行自动代码分析以强制执行特定的样式决策。一致的风格使错误更易于追踪。
  4. 使用单元测试。核心模块Test :: More让您可以轻松开始使用它。