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 处。 
您看,不是很容易吗?