中文版 Perl CGI 程式写作常问问题集(三) - 中国WEB开发者网络 (http://www.webasp.net) -- 技术教程 (http://www.webasp.net/article/) --- 中文版 Perl CGI 程式写作常问问题集(三) (http://www.webasp.net/article/8/7745.htm) |
| -- 作者:未知 -- 发布日期: 2003-09-13 |
| Q1.7: 网路上是不是有专门收藏邮递论坛或新闻讨论群组的 posts 的站? 是的,您可以试试 The Usenet Newstand (<http://CriticalMass.com/Concord/>。 所有comp.infosystems.www.* 讨论群组的文章都收集在那儿*。同时,cgi-perl 及 libwww 这两个邮递论坛他们也有收集。 【译者】您同时可以试试 DejaNews (<http://www.dejanews.com/> 、 AltaVista (<http://www.altavista.digital.com/> ,和 HotBot (<http://www.hotbot.com/> 这几个搜寻引擎/资料库。 DejaNews (<http://www.dejanews.com/> 甚至连 tw.bbs.* 都收集(其他两个或 许也有,但译者没试过)。 --------------------------------------------------------------------------- 2.0 - Modules (模组) --------------------------------------------------------------------------- Q2.1: 我是不是该用 Perl CGI modules* 来写 CGI scripts ?自己做不是比较容易 吗? 【译者】 CGI modules 在此指 CGI.pm 及其他 CGI::* 的模组;详见 Q2.4 。 这完全取决於您要做的是什麽。CGI modules 较适合重量级的 CGI scripts 。如果 是简单的 scripts 的话,自己做或者是用 CGI Lite 这个模组会简便许多。如果您 真的愿意,您甚至可以用旧的 Perl4 cgi-lib.pl 这个 library*。 【译注】作者 Tom C. 之所以这麽说是因为他基本上不赞成使用 cgi-lib.pl ,有兴趣的读者可以看他写的 Why I am not fond of cgi-lib.pl (<http://www.perl.com/perl/info/www/!cgi-lib.html> (为什麽我不欣赏 cgi-lib.pl )。 --------------------------------------------------------------------------- Q2.2: 如何知道某个 module 该怎麽个用法? 大多数 modules 的使用说明是直接嵌在程式里的*。如果是这样的话,您可以用 pod2man 这个 script 来阅读使用指南: % pod2text name_of_module.pm % pod2man name_of_module.pm | nroff -man | more 【译注】如果您在 *.pm 档中看到 ``=head1''、``=cut'' 这类的东西便 是显示使用说明有附在里头。这是 Larry Wall 设计的 POD (Plain Old Document) 格式。详见 perlpod manpages。 --------------------------------------------------------------------------- Q2.3: 有哪些 Perl4 的 CGI 或 WWW的 libraries ? 最广为使用的 Perl4 CGI library 是 Steve Brenner 的 cgi-lib.pl (<http://www.bio.cam.ac.uk/web/form.html>。 --------------------------------------------------------------------------- Q2.4: 有哪些给 Perl5 使用的 CGI modules?我该用哪个?为什麽? CGI.pm (<http://www-genome.wi.mit.edu/ftp/pub/software/WWW/CGI.pm.tar.gz>* 这个很棒的 module 在功能上和部分 CGI::* modules 相重叠。如果您不想和多 重 modules 打交道的话,您可以只用这一个。我们等一下在後头会给您看一个 用 CGI.pm 来替 CGI scripts 除错的实例。 此外,Lincoln (Lincoln Stein;CGI.pm 的作者)还写了一本讨论 Web 和 CGI 非常好的书,叫 How To Set Up and Maintain a World Wide Web Site (<http://www.aw.com/cp/Stein2e.html>。 【译者】建议读者多使用 CGI.pm 。CGI::* 已经有很长一段时间没 有更新了,而 CGI.pm 则不断的有改良的新版推出,并已加入对 FastCGI (<http://www.fastcgi.com/> 的支援,因此对 FastCGI 的使用者也相当方便。此外,mod_perl (<http://www.osf.org/~dougm/apache/> (Apache (<http://www.apache.org/> 的 perl module)中所附的 CGI::XA ,也是由 CGI.pm 改进而来的。 CGI.pm 让使用者免除自己做低阶资 料处理(如印 HTTP 标头、替 form, cookies 资料解码等)的麻 烦。 CGI::* 模组套件 (<http://www-genome.wi.mit.edu/ftp/pub/software/WWW/CGIperl/> 这些模组原先大多是由 Tim Bunce 所写,现在则由 Lincoln Stein 来负责维 护。它们的功能包括了帮您产生及处理 form ,替 CGI 程式除错,以及在不同 的 forms 之间维系一个状态值。 CGI Lite (<http://dongpo.math.ncu.edu.tw/perl/CPAN/authors/id/SHGUN/CGI_Lite-1.62.pm.gz> ) 这个轻量级的 module 是 CGI::* modules 之外的另一个选择。它可算是在老旧 的 cgi-lib.pl (<http://www.bio.cam.ac.uk/web/form.html> 之上改良、加 料後的产物。 以上三者均有能力处理 multipart form 资料(即上传)。 --------------------------------------------------------------------------- Q2.5: 为什麽这麽多 perl CGI libraries 都是 object-oriented (物件导向)的? 我对用物件导向来写程式一窍不通。难道就没有简单一点,给不会物件导向的人使用 的 libraries 吗?物件导向有多难? 其实使用物件导向的 modules 并不难。先去看看 Tom Christiansen 的 Easy Intro to Using Perl Objects (<http://perl.com/perl/everything_to_know/easy_objects.html> (简单介绍如 何使用 Perl 物件)吧。 前头提到的 CGI modules 用起来真的是很容易!这里有一个用 CGI Lite 印出 form 资料的实例*: 【译者】CGI.pm 的使用说明 (<http://www-genome.wi.mit.edu/ftp/pub/software/WWW/>中有更多范 例可供参考。 #!/usr/local/bin/perl -w use CGI_Lite; $cgi = new CGI_Lite; %data = $cgi->parse_form_data; print "Content-type: text/plain", "\n\n"; foreach $key (keys %data) { print $key, " = ", $data{$key}, "\n"; } exit 0; 要注意的是,即使您机器上的 Perl 不是您装的(您不是系统管理者),或是您权限 不够无法将这些 modules 和其他的 Perl library 档案安装在同一个地方,您还是 可以使用这些 modules 的 -- 只要将它们摆在一个自己方便的地方,然後在您的 script 开始处加上*: BEGIN { unshift @INC, "/your/dir/favorite/place"; } 【译者】建议改用较新的方式: use lib qw(/your/dir/favorite/place); 好。以下是一个用到 CGI::* modules 的例子: #!/usr/local/bin/perl -w use CGI::Form; $cgi_form = new CGI::Form; print <<'End_of_Header'; <HTML> <HEAD><TITLE>看著我做!</TITLE></HEAD> <BODY> <H1>看著我做!</H1> End_of_Header print $form->startform; ## 产生一个单行输入栏位 (text field) print '姓名: '; print $form->textfield('name'), "<BR>\n"; ## 产生一组单选按纽 (radio buttons) print '<P>您住哪儿: <BR>'; print $form->radio_group(-name => 'where', -values => ['北美洲', '南美洲', '欧洲', '澳洲', '亚洲', '南极洲'], -default => '北美洲', -linebreak => 'true'); ## 产生一个多行输入栏位 (textarea) print '意见: '; print $form->textarea('comments', undef, 5, 40); print "<P>"; print $form->reset; print $form->defaults; print $form->submit('送出!', 'Submit'); print $form->endform; print "</BODY></HTML>"; reset、defaults,及submit三种方法( methods ) 会产生不同的类型的按钮。reset 这个按钮让您把目前 form 栏位中所填的资料洗掉,并显示属於上一个状态(或回 合)的资料。 defaults 这个按钮则是将form 栏位资料彻底洗去。还有 submit 这 个方法产生一个送出钮以便让人将资料送至 server 处。 您看,不是很容易吗? |
| webasp.net |