CGI::Fast。虽然当一个 CGI 应用程序仅需使用少量的代码(例如当你分析 $ENV{QUERY_STRING} )或优先考虑运行速度时(例如你正在编译一个 200 KB 的模块),不使用预建立的模块而直接编写脚本会比较好。但通常来说,CGI 模块会更适用。 CGI 模块使用 CGI 模块的第一个优点是它不可替代的文件上传功能,这一点在不同的平台和浏览器中的体现稍有不同。CGI 模块提供了上传文件所需的所有工具,包括处理 HTTP 标题 和 cookies,从命令行运行脚本,以及支持 NPH 脚本和文件上传功能。此外,模块可以在面向对象的样式和面向函数的样式中方便的使用。 CGI 模块本身是一个复杂的甚至是极难懂的包含许多 Perl 语言特征的应用程序。所以不奇怪,某些专家认为如果您理解了 GGI.pm 模块,自然也就懂得了 Perl!由 Lincoln Stein 编写的 CGI.pm 是大多数通过 Perl 构建 Web 应用程序的开发人员所广泛使用的模块。您可通过 CPAN 获得该模块,请在 CGI.pm 页上参阅它的最新文档。 不幸的是,复杂的库通常包含精妙深奥之处从而增加了使用的难度。但另一方面,CGI 模块的复杂之处只在某种条件下才表现出来。例如,在 HTML 表单里执行文件上传功能,而 CGI 文档却未能告知所有功能。在下面的清单 1 里,用户把一个文件上传到 Web 服务器上。当处理表单时,脚本获得文件的内容并显示在浏览器中;它们被附在
和标记之间。 清单 1. 文件上传代码样本 #!/usr/bin/perl -Tw use CGI ':standard'; use strict; my $out = start_multipart_form.filefield(-name => 'upload'); $out .= br.submit('submit','Send').end_form; my$file = param('upload'); #the filename returned is also a file handle if(request_method eq 'POST' && defined $file && ref $file && ref $file eq 'Fh') { local $/ = undef; #read the whole file $out .= pre <$file>||''; #takes care not to send uninitialized value close $file if $CGI::OS ne 'UNIX'; #such as Win32 platforms } print header,start_html('Sample upload page'),$out,end_html; 在这里, "$out .= pre <$file>||'';" 这一行是必需的。当用户发送一个空文件或键入无效的文件名时,菱形操作符返回未初始化定义的值,使 pre 函数无法正常运行。 此外, $file 需要很多确认信息,因为当一个简单的表单使用 POST 方法时, $file 不再是一个文件句柄。 某些操作系统需要显式地关闭临时文件。Win32 系统是这样的,但 UNIX 平台并不如此。这些都是文档里没有指出的所有 CGI 模块的精妙之处,而就是这些精妙之处使得模块在这些情况下变得更为复杂。 -------------------------------------------------------------------------------- 回页首在浏览器中显示脚本错误调试代码时,在浏览器窗口显示语法和运行时错误会很有用。在我们看来,编写脚本的整个过程应包含编辑脚本文件,保存脚本及刷新浏览器窗口。让我们来看它是怎么工作的。清单 2. 最完整的调试打印代码执行 #!/usr/bin/perl -Tw use strict; #restrict unsafe constructs use CGI ':standard'; use CGI::Carp qw/carpout fatalsToBrowser set_message/; use diagnostics -verbose; #print warning diagnostics BEGIN { local *LOG; my $size = -s "my.log" || 0; open LOG, ">>my.log" or die "Can't open: $!"; carpout(\*LOG); my $errors = 0; sub handle_errors #will be called with the text of the error { $errors = defined $_[0] && $_[0] || $errors, $size } set_message(\&handle_errors); } END { my($errors, $size) = handle_errors; if($errors) { local *LOG; local $/ = undef; open LOG, "my.log" or die "Can't open: $!"; seek LOG,$size,0; #skip previous error log local $_ =
"; print "$errors\n$_
相关视频
相关阅读 Win2003下配置asp+cgi+php+mysqlapache五合一程序建立PHP+CGI运行环境Javascript实例教程14 JS代替CGI六、访问CGI变量如何在98上支持cgiphpaspmysql动态网页技术--CGI:ASP:JSP:PHP4动态网页技术--CGI:ASP:JSP:PHP3动态网页技术--CGI:ASP:JSP:PHP2
热门文章 没有查询到任何记录。
最新文章
没有查询到任何记录。
查看所有0条评论>>