代码之家  ›  专栏  ›  技术社区  ›  cowgod

在PerlCGI脚本中打印HTML之后我该怎么做?

  •  4
  • cowgod  · 技术社区  · 15 年前

    从PerlCGI脚本打印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或返回以直观地显示脚本应该在该时间结束? 我知道这不是写这篇文章的最好方法——为了这个问题,请把它按面值记下来。

    #!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 回复  |  直到 15 年前
        1
  •  4
  •   Rick C. Petty    15 年前

    您应该始终在输出的末尾打印出\n \n“,以告诉Web服务器输出已完成。成功终止脚本后,Apache可能会为您执行此操作。

    如果脚本完成了,您应该在技术上使用适当的退出状态调用“exit”——成功为零,错误为非零。Web服务器检查退出状态并呈现适当的页面(如果退出状态显示除成功以外的任何内容,则通常会显示错误代码500)。如果不指定“返回”值或直接调用exit,Perl(在本例中)将假定成功终止,并且Web服务器将把CGI脚本视为与调用“exit(0)”相同。

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

        2
  •  3
  •   Varkhan    15 年前

    我想这更多的是关于编码风格而不是功能性的问题。 如果您有一个简单、简单的程序,没有分支,那么就没有理由用任何特殊的方法来标记程序的终止:

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

    但是,如果结构更复杂,我建议 作记号 终止点由某个特定的东西表示,向阅读您的代码的人发出这样的信号:对于定义的一组条件,不再需要考虑这些条件。

    我会用 出口 而不是 返回 ,原因很简单,返回可能被误认为是Sub的结尾,而exit非常明确地声明程序 终止 在这一点上。

        3
  •  1
  •   Björn    15 年前

    不,没关系。我总是让脚本自行终止,而不是“return;”或“exit;”,因为这两个语句(即Perl文档的末尾)都不需要,而且它与“exit;”或“exit 0;”是相同的。

        4
  •  1
  •   Paul Tomblin    15 年前

    我建议返回而不是退出,这样如果您切换到cgi::fast,您就可以将其转换为Sub。

        5
  •  0
  •   Foofy    15 年前

    如果它是一个独立的东西,你不必返回或退出,这是有意义的。但如果这段代码来自函数内部呢?它仍然适用吗?出于某种原因,返回还是退出?它还只是样式吗?

        6
  •  0
  •   Gaurav    15 年前

    要回答您的“更新”问题:在我当前的应用程序中,我使用常见的方法执行以下操作:

    # 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 euperl或者回到cgi。或者更好的是,从头开始编写应用程序以使用更多的Ajax——这样,我的大部分“操作”都是由非常小的Perl脚本执行的,这些脚本只处理输入并在 text/plain text/json .