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」を出力して、出力が終了したことを Web サーバーに伝える必要があります。スクリプトの終了が成功すると、Apache がこれを行う場合があります。

スクリプトが終了したら、適切な終了ステータス (成功の場合はゼロ、エラーの場合はゼロ以外) で "exit" を技術的に呼び出す必要があります。Web サーバーは終了ステータスを検査し、適切なページをレンダリングします (終了ステータスが成功以外の場合は、エラー コード 500 が一般的です)。"return" 値を指定しないか、exit を直接呼び出さない場合、Perl (この場合) は正常に終了したと見なし、Web サーバーは CGI スクリプトを "exit(0)" を呼び出した場合と同じように扱います。

これはすべて CGI 仕様 (RFC 3875 が現在、IIRC) で説明されています。

于 2009-04-08T23:02:59.883 に答える
1

いいえ、関係ありません。私はいつも、'return;' ではなく、スクリプトを自然に終了させます。または「終了;」これらのステートメントのいずれも (perl 文書の最後にある) 必要がなく、'exit;' と同じものだからです。または 'exit 0;'.

于 2009-04-08T22:47:17.703 に答える
0

それがスタンドアロンのものである場合、必ずしも戻るか終了する必要はないということは理にかなっています。しかし、このスニペットが関数内からのものである場合はどうなるでしょうか? それはまだ適用されますか?何らかの理由で return または exit が優先されますか? まだスタイリングだけですか?

于 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て実行することもできますが、私はそうしません。

これは、私がやり直さなければならない場合、今私が行う方法ではありません: 私は、mod_perl にすばやく移行したり、CGI に戻ったりすることができる、Catalyst などのある種の中間層にもっと依存するでしょう。 . または、アプリケーションをゼロから作成して、より多くの AJAX を使用することもできます。この方法では、ほとんどの「アクション」は、入力を処理して Javascript アプリケーションに応答するだけの非常に小さな Perl スクリプトによって実行されtext/plainますtext/json

于 2009-04-09T05:52:05.733 に答える