如果我在Perl中使用CGI模块,我可以这样做
$cgi = CGI->new();
$cgi->header(-type=>"text/html");
或者去寻找经典
print "Content-Type: text/html\r\n\r\n";
我们使用的是否重要?这两者有什么区别吗?两者似乎都有效。
对我来说,如果我使用CGI,我会选择第一个,但如果没有,那么我就不会因为只有一个动作而加载模块。但只是想知道这个问题是否有任何意义?
精神科
答案 0 :(得分:2)
严格来说,你必须打印\ r \ n字符:
print "Content-Type: text/html\r\n\r\n"
是表达您想说的内容的合法方式。
一般来说,我会坚持使用CGI提供的功能。 它允许更简洁和可读的代码,CGI比你更了解这些细节。
答案 1 :(得分:2)
严格来说,您必须打印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 :(得分:0)
在perl中,转义码“\ r”和“\ n”不能保证与“\ 015”和“\ 012”相同。
如果要为网络协议打印CRLF,则应使用“\ 015 \ 012”或“\ cM \ cJ”。
这是引用,直接来自perldoc perlop:
所有系统都使用虚拟“\ n”来表示行终止符, 称为“换行符”。没有不变的,物质的东西 换行符。操作系统只是一种幻觉, 设备驱动程序,C库和Perl都密谋保留。不 所有系统都将“\ r”读作ASCII CR,将“\ n”读作ASCII LF。例如, 在过去的古代Mac(前MacOS X)上,这些曾经是 反转,在没有行终止符的系统上,打印“\ n”可能 不发出实际数据。一般来说,当你的意思是“换行符”时,请使用“\ n” 对于您的系统,但在需要精确时使用文字ASCII 字符。例如,大多数网络协议期望并且更喜欢a CR + LF(“\ 015 \ 012”或“\ cM \ cJ”)用于行终止符,尽管如此 他们经常只接受“\ 012”,他们很少只容忍“\ 015”。如果 你养成了使用“\ n”进行网络化的习惯,你可能会被烧毁 有一天。
来自perldoc -f binmode的类似信息:
操作系统,设备驱动程序,C库和Perl运行时 系统都密谋让程序员处理一个字符(\ n )作为线路终结器,不考虑外部表示。上 许多操作系统,本机文本文件表示匹配 内部表示,但在某些平台上是外部的 \ n的表示由多个字符组成。
VMS上Unix,Mac OS(旧版和新版)以及Stream_LF文件的所有变体 使用单个字符结束外部表示中的每一行 文本(即使这个单字符是旧的CARRIAGE RETURN, 早期的Darwin风格的Mac OS,在Unix和大多数VMS上都是LINE FEED 文件)。在其他系统,如OS / 2,DOS和各种风格的 MS-Windows,您的程序将\ n视为一个简单的\ cJ,但存储的是什么 在文本文件中是两个字符\ cM \ cJ。这意味着,如果你 不要在这些系统上使用binmode(),磁盘上的\ cM \ cJ序列将是 在输入时转换为\ n,程序中的任何\ n都将被转换 返回\ cM \ cJ输出。这是你想要的文本文件,但它 对二进制文件来说可能是灾难性的。
答案 3 :(得分:0)
糟糕的使用
print "Content-Type: text/html\r\n\r\n"
如果您想使用 CGI 添加内容类型和 Cookie ,则无法添加其他标题,此处为工作示例解决方案p>
my $cgi = CGI->new;
my $cookie = $cgi->cookie(-name => 'CookieName', -value => 'CookieValue');
print $cgi->header( -cookie => $cookie,
-type => 'text/html',
-charset => 'charset=UTF-8');