Следует использовать метод заголовка CGI.pm для вывода заголовка Content-Type? - PullRequest
3 голосов
/ 20 января 2010

Если я использую модуль CGI в Perl, я могу сделать это

$cgi = CGI->new();
$cgi->header(-type=>"text/html");

Или пойти на классический

print "Content-Type: text/html\r\n\r\n";

Имеет ли значение то, что мы используем? Есть ли разница между этими двумя? Кажется, оба работают.

Для меня я бы пошел первым, если бы в любом случае использовал CGI , но если нет, то я бы не стал загружать модуль всего одним действием. Но просто интересно, есть ли что-нибудь на эту тему?

Psy

Ответы [ 4 ]

2 голосов
/ 20 января 2010

Строго говоря, вы должны напечатать CRLF пар. Это не то же самое, что "\ r \ n \ r \ n", если вы сначала не используете binmode STDOUT.

print "Content-Type: text/html\r\n\r\n";
C:\Temp> t | xxd
0000000: 436f 6e74 656e 742d 5479 7065 3a20 7465  Content-Type: te
0000010: 7874 2f68 746d 6c0d 0d0a 0d0d 0a         xt/html......

Вы должны использовать CGI.pm . Или, если, как и я, вам не нужен весь исторический багаж, используйте CGI :: Simple .

2 голосов
/ 20 января 2010

Строго говоря, вы должны напечатать символы \ r:

print "Content-Type: text/html\r\n\r\n"

- это законный способ выразить то, что вы хотите сказать.

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

0 голосов
/ 19 октября 2013

плохое использование

print "Content-Type: text/html\r\n\r\n"

вы не можете добавить еще один заголовок, здесь работает пример решения, если вы хотите добавить Content-Type и Cookies , используя CGI

my $cgi = CGI->new;
my $cookie = $cgi->cookie(-name  => 'CookieName', -value => 'CookieValue');

print $cgi->header( -cookie => $cookie,
                    -type    => 'text/html',
                    -charset => 'charset=UTF-8');
0 голосов
/ 11 февраля 2013

В Perl escape-коды "\ r" и "\ n" НЕ гарантированно идентичны "\ 015" и "\ 012".

Если вы хотите напечатать CRLF для сетевого протокола, вы должны использовать «\ 015 \ 012» или «\ cM \ cJ».

Вот цитата, прямо из perldoc perlop:

Все системы используют виртуальный «\ n» для представления ограничителя строки, называется "новой строкой". Нет такой вещи, как неизменный, физический символ новой строки. Это всего лишь иллюзия, что операционная система, драйверы устройств, библиотеки C и Perl - все это для сохранения. Не все системы читают "\ r" как ASCII CR и "\ n" как ASCII LF. Например, на древних Маках (до MacOS X) прошлых лет в обратном порядке, и в системах без ограничителя строки, печать "\ n" может не излучать фактические данные. В общем, используйте «\ n», когда имеете в виду «новую строку» для вашей системы, но используйте буквальный ASCII, когда вам нужен точный персонаж. Например, большинство сетевых протоколов ожидают и предпочитают CR + LF ("\ 015 \ 012" или "\ cM \ cJ") для ограничителей строки, и хотя они часто принимают только «\ 012», они редко терпят просто «\ 015». Если вы привыкли использовать "\ n" для работы в сети, вы можете быть сожжены когда-нибудь.

И еще, аналогичная информация, из perldoc -f binmode:

Операционная система, драйверы устройств, библиотеки C и среда выполнения Perl все системы сговорились, чтобы позволить программисту обрабатывать один символ (\ n ) как терминатор строки, независимо от внешнего представления. На во многих операционных системах родное представление текстового файла соответствует внутреннее представление, но на некоторых платформах внешнее представление \ n состоит из более чем одного символа.

Все варианты файлов Unix, Mac OS (старые и новые) и Stream_LF в VMS использовать один символ для завершения каждой строки во внешнем представлении текста (даже если этот единственный символ является возврат каретки на старом, предшествует дарвиновским версиям Mac OS и является LINE FEED в Unix и большинстве VMS файлы). В других системах, таких как OS / 2, DOS и различные разновидности MS-Windows, ваша программа видит \ n как простой \ cJ, но что хранится в текстовых файлах есть два символа \ cM \ cJ. Это означает, что если вы не используйте binmode () в этих системах, последовательности \ cM \ cJ на диске будут преобразуется в \ n на входе, и любой \ n в вашей программе будет преобразован вернуться к \ cM \ cJ на выходе. Это то, что вы хотите для текстовых файлов, но это может иметь катастрофические последствия для двоичных файлов.

...