中文版 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 |