4

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

6 回答 6

4

你应该总是在你的输出结束时打印出“\n\n”来告诉网络服务器输出已经完成。Apache 可能会在脚本成功终止时为您执行此操作。

如果您的脚本已完成,您应该在技术上调用具有适当退出状态的“exit”——成功为零,错误为非零。网络服务器检查退出状态并呈现适当的页面(如果退出状态显示除成功以外的任何内容,则错误代码 500 是典型的)。如果您没有指定“返回”值或直接调用 exit,Perl(在这种情况下)将假定成功终止,并且网络服务器将处理您的 CGI 脚本,就像您调用“exit(0)”一样。

这在 CGI 规范中都有描述(RFC 3875 是当前的,IIRC)。

于 2009-04-08T23:02:59.883 回答
3

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

  • return不会返回任何人都可以使用的任何东西,因为你的程序在这里结束
  • exit只会以状态 0 退出,无论如何这都会自然发生

但是,如果结构更复杂,我建议用特定的东西标记终止点,以向阅读您的代码的人发出信号,对于定义的一组条件,那里不再需要考虑任何事情。

我会使用exit而不是return,原因很简单,return 可能会被误认为是 sub 的结束,而 exit 非常明确地指出程序在此时终止。

于 2009-04-08T22:48:56.017 回答
1

不,没关系。我总是让剧本自己死掉,而不是“回归”;或“退出;” 因为不需要这些语句中的任何一个(在 perl 文档的末尾),它与“exit;”是一样的。或“退出 0;”。

于 2009-04-08T22:47:17.703 回答
1

我会推荐 return 而不是 exit,这样如果你切换到 CGI::Fast 你就可以把它变成一个 sub。

于 2009-04-08T23:06:18.080 回答
0

如果它是一个独立的东西,你不必返回或退出是有道理的。但是如果这个片段来自一个函数呢?它仍然适用吗?出于某种原因,是否会首选返回或退出?它仍然只是造型吗?

于 2009-04-08T22:58:09.580 回答
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();

如果您喜欢冒险,您可以自动上钩BEGINEND自动执行此操作,但我不会 - 我认为为了一个相当小的好处而摆弄太多了。

这不是我现在要做的,如果我必须重新做的话:我会更多地依赖某种中间层,比如 Catalyst,它可以让我快速升级到 mod_perl 或回到 CGI . 或者更好的是,从头开始编写我的应用程序以使用更多的 AJAX - 这样,我的大部分“操作”都是由非常小的 Perl 脚本执行的,这些脚本只处理输入并在text/plainor中响应 Javascript 应用程序text/json

于 2009-04-09T05:52:05.733 回答