Что мне делать после печати HTML в моем скрипте Perl CGI? - PullRequest
4 голосов
/ 09 апреля 2009

Что вы должны назвать после печати HTML из скрипта Perl CGI? Я видел пустые операторы 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 ]

4 голосов
/ 09 апреля 2009

Вы всегда должны распечатывать «\ n \ n» в конце вашего вывода, чтобы сообщить веб-серверу, что выход закончен. Apache может сделать это за вас при успешном завершении скрипта.

Если ваш сценарий завершен, вы должны технически вызвать «выход» с соответствующим состоянием выхода - ноль для успеха, ненулевое значение для ошибок. Веб-сервер проверяет состояние выхода и отображает соответствующую страницу (код ошибки 500 типичен, если в состоянии выхода отображается что-то кроме успеха). Если вы не укажете значение «return» или вызовите exit напрямую, Perl (в данном случае) примет успешное завершение, и веб-сервер будет обрабатывать ваш CGI-скрипт так же, как если бы вы вызывали «exit (0)».

Это все описано в спецификации CGI (RFC 3875 является текущим, IIRC).

3 голосов
/ 09 апреля 2009

Полагаю, это больше вопрос стиля кодирования, чем функциональности. Если у вас есть простая, простая программа без ветвления, нет особых оснований отмечать завершение программы чем-то особенным:

  • return не вернет ничего, что кто-либо может использовать, так как ваша программа заканчивается здесь
  • выход просто собирается выйти со статусом 0, что в любом случае произойдет естественным образом

Однако, если структура более сложная, я бы посоветовал пометить точку завершения чем-то конкретным, чтобы сообщить кому-то, кто читает ваш код, что для этого определенного набора условий ничего нет принимать во внимание там больше.

Я бы использовал exit вместо return , по той простой причине, что return может быть ошибочно принят за конец подпрограммы, в то время как exit очень точно утверждает, что программа заканчивается на этом этапе.

1 голос
/ 09 апреля 2009

Я бы порекомендовал возврат вместо выхода, чтобы при переключении на CGI :: Fast можно было просто превратить его в саб.

1 голос
/ 09 апреля 2009

Нет, это не имеет значения. Я всегда позволяю сценарию умереть сам по себе вместо «возврата»; или «выход»; поскольку нет необходимости ни в одном из этих утверждений (в конце документа perl, который есть), и это то же самое, что и 'exit;' или «выход 0;».

0 голосов
/ 09 апреля 2009

Чтобы ответить на ваш «обновленный» вопрос: в моем текущем приложении я использую общие методы, чтобы сделать что-то вроде этого:

# 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();

Если вы чувствуете себя авантюрным, вы могли бы зацепить BEGIN и END, чтобы сделать это автоматически, но я бы не стал - я думаю, что было бы слишком много возиться для довольно незначительное преимущество.

Это не то, как я бы сделал это сейчас, если бы мне пришлось делать все это заново: я бы больше полагался на какой-то средний слой, такой как Catalyst, который позволил бы мне быстро перейти к mod_perl или вернуться к CGI. Или, что еще лучше, напишите мое приложение с нуля, чтобы использовать больше AJAX - таким образом, большинство моих «действий» выполняются очень маленькими скриптами Perl, которые просто обрабатывают ввод и отвечают на приложение Javascript в text/plain или text/json.

0 голосов
/ 09 апреля 2009

имеет смысл, что вам не обязательно возвращаться или выходить, если это отдельная вещь. но что, если этот фрагмент находится внутри функции? это все еще применимо? будет ли возвращение или выход предпочтительнее по какой-то причине? это все еще просто стиль?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...