在Perl CGI脚本中打印HTML后我该怎么办?

时间:2009-04-08 22:39:56

标签: html perl cgi

从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?
}

6 个答案:

答案 0 :(得分:4)

您应该始终在输出结尾打印出“\ n \ n”,告诉网络服务器输出已完成。 Apache可以在成功终止脚本时为您执行此操作。

如果您的脚本已完成,您应该从技术上调用“退出”并使用适当的退出状态 - 零表示成功,非零表示错误。 Web服务器检查退出状态并呈现相应的页面(如果退出状态显示除成功之外的任何内容,则典型的错误代码500)。如果您没有指定“返回”值或直接调用exit,则Perl(在本例中)将假定成功终止,并且Web服务器将处理您的CGI脚本,就像您调用“exit(0)”一样。

这些都在CGI规范中描述(RFC 3875是最新的,IIRC)。

答案 1 :(得分:3)

我想这更像是一个关于编码风格而不是功能的问题。 如果你有一个简单,直接的程序,没有分支,没有理由用特殊的东西来标记程序的终止:

  • 返回不会返回任何人可以使用的内容,因为您的程序在此结束
  • 退出即将退出状态为0,无论如何都会自然发生

但是,如果结构更复杂,我会建议标记终止点通过特定的东西,发信号给那些读取你的代码的人,对于那个定义的条件,有没有什么可以考虑的了。

我会使用退出而不是返回,原因很简单,返回可能会被误认为是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