Mik*_*ley 3 debugging validation perl
我是Perl的新手,刚刚开始使用它,最初学过JavaScript.我想知道是否有可能验证Perl代码的验证器(如JS的Firebug).如果有人知道一个可靠的人,我将不胜感激.我用Google搜索了很多次,收效甚微,而且我们都知道学习新语言时会出现错误.提前致谢!.
Leo*_*era 17
Perl本身呢?
perl -c your_program.pl
Run Code Online (Sandbox Code Playgroud)
如果您在程序开头添加以下内容,您将避免许多麻烦.
use strict;
use warnings;
use diagnostics;
Run Code Online (Sandbox Code Playgroud)
最后,还有Perl :: Critic.
要检查语法是否干净,您可以尝试perl -c filename.为了清理代码格式,您可能需要查看PerlTidy..你可能不需要一个vaidator.你可以做些自己的事.
重定向错误消息
默认情况下,错误消息将发送到STDERR.大多数HTTPD服务器将STDERR定向到服务器的错误日志.某些应用程序可能希望保留私有错误日志,与服务器的错误日志不同,或者他们可能希望将错误消息定向到STDOUT,以便浏览器接收它们.
该carpout()功能是为此目的而提供的.由于carpout()默认情况下未导出,因此您必须明确地导入它
use CGI::Carp qw(carpout);
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
FileHandle和其他对象也可以工作.
在浏览器窗口中出现PERL错误
如果要向浏览器发送致命(死亡,忏悔)错误,请要求导入特殊的"fatalsToBrowser"子例程:
use CGI::Carp qw(fatalsToBrowser);
die "Bad error here";
Run Code Online (Sandbox Code Playgroud)
现在,致命错误将回显到浏览器以及日志.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!");
Run Code Online (Sandbox Code Playgroud)
您还可以传入代码引用以创建自定义错误消息.在运行时,将使用导致脚本死亡的错误消息文本调用您的代码.例:
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);
}
Run Code Online (Sandbox Code Playgroud)
因为perl是一种动态语言,所以有许多事情无法验证; 例如,您可以调用编译时不存在的子,因为它可以在运行时创建.静态验证器无法知道呼叫是否正确.
如果您只想知道代码是否编译,请使用perl解释器本身.
如果要检查代码是否符合给定的编码标准,请使用Perl :: Critic.
有很多方法可以解决这个问题.您可以阅读http://perldoc.perl.org/perldebug.html以了解如何使用调试器,调试器在某些方面类似于Firebug.但是还有很多其他方法可以自动避免问题.
如果使用use strict启动代码,则会自动捕获许多类常见错误; 使用警告;
http://perltidy.sourceforge.net/重新格式化你的代码,并且很容易发现许多常见的错误.