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