从Perl CGI脚本打印HTML后,您应该调用什么?我看过空return
语句,exit
语句,在某些情况下根本没有。这有关系吗?
#!perl
print "Content-type: text/html\n\n";
print <<'END_HTML';
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Hello world!</title>
</head>
<body>
<h1>Hello world!</h1>
</body>
</html>
END_HTML
# do anything else here?
# return;
# exit;
假设你有一些测试用于打印不在文件末尾的HTML。在这种情况下,更清楚的是调用exit或return来直观地显示脚本应该在那时结束吗? 我知道这不是写这篇文章的最佳方式 - 请为了这个问题而将其视为面值。
#!perl
use CGI;
my $q = CGI->new();
my $action = $q->param('action');
my $html_start = "Content-type: text/html\n\n";
$html_start .= <<'END_HTML';
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Hello world!</title>
</head>
<body>
END_HTML
my $html_end = <<'END_HTML';
</body>
</html>
END_HTML
if ($action eq 'foo') {
print $html_start;
print '<p>foo</p>';
print $html_end;
# do anything else here?
}
else {
print $html_start;
print '<p>bar</p>';
print $html_end;
# do anything else here?
}
答案 0 :(得分:4)
您应该始终在输出结尾打印出“\ n \ n”,告诉网络服务器输出已完成。 Apache可以在成功终止脚本时为您执行此操作。
如果您的脚本已完成,您应该从技术上调用“退出”并使用适当的退出状态 - 零表示成功,非零表示错误。 Web服务器检查退出状态并呈现相应的页面(如果退出状态显示除成功之外的任何内容,则典型的错误代码500)。如果您没有指定“返回”值或直接调用exit,则Perl(在本例中)将假定成功终止,并且Web服务器将处理您的CGI脚本,就像您调用“exit(0)”一样。
这些都在CGI规范中描述(RFC 3875是最新的,IIRC)。
答案 1 :(得分:3)
我想这更像是一个关于编码风格而不是功能的问题。 如果你有一个简单,直接的程序,没有分支,没有理由用特殊的东西来标记程序的终止:
但是,如果结构更复杂,我会建议标记终止点通过特定的东西,发信号给那些读取你的代码的人,对于那个定义的条件,有没有什么可以考虑的了。
我会使用退出而不是返回,原因很简单,返回可能会被误认为是sub的结尾,而exit非常明确地表明程序< em>此时终止。
答案 2 :(得分:1)
不,没关系。我总是让脚本自己死,而不是'返回'。或'退出;'因为不需要这些语句中的任何一个(在perl文档的末尾),它与'exit;'相同;或'退出0;'。
答案 3 :(得分:1)
我建议返回而不是退出,这样如果你切换到CGI :: Fast,你可以把它变成一个子。
答案 4 :(得分:0)
如果它是一个独立的东西,你不必返回或退出是有道理的。但是如果这个片段来自一个函数呢?它还会适用吗?出于某种原因会退回还是退出?它仍然只是造型?
答案 5 :(得分:0)
回答你的“更新”问题:在我目前的应用程序中,我使用常用方法做这样的事情:
# UI.pm
package UI;
sub top { print "<html><head><title>$_[0]</title><body>"; }
sub bottom { print "</body></html"; }
# All the individual .cgi files
package main;
UI::top('Welcome to my page');
print "<p>Welcome to my page!</p>";
UI::bottom();
如果您喜欢冒险,可以hook BEGIN
and END
自动执行此操作,但我不会 - 我认为为了获得相当小的利益而过于挣扎。
这不是我现在的方式,如果我不得不这样做:我更依赖于某种中间层,比如Catalyst,它可以让我快速向上移动到mod_perl或回到CGI。或者甚至更好,从头开始编写我的应用程序以使用更多的AJAX - 这样,我的大多数“动作”都是由非常小的Perl脚本执行的,它只处理输入并响应{{1中的Javascript应用程序}或text/plain
。