[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > Perl > 正文
Perl CGI 程式寫作常問問題集(2) Modules (模組)
不詳 (2001-05-15 04:15:00)

  
  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 (為什麼我不欣賞 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。 



--------------------------------------------------------------------------------

Q2.4: 有哪些給 Perl5 使用的 CGI modules?我該用哪個?為什麼?
CGI.pm* 
這個很棒的 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。 

【譯者】 建議讀者多使用 CGI.pm 。CGI::* 已經有很長一段時間沒有更新了,而 CGI.pm 則不斷的有改良的新版推出,並已加入對 FastCGI 的支援,因此對 FastCGI 的使用 者也相當方便。此外,mod_perl (Apache 的 perl module)中所附的 CGI::XA,也是由 CGI.pm 改進而來的。 CGI.pm 讓使用者免除自己做低階資料處理 (如印 HTTP 標頭、替 form, cookies 資料解碼等)的麻煩。 

CGI::* 模組套件 
這些模組原先大多是由 Tim Bunce 所寫,現在則由 Lincoln Stein 來負責 維護。它們的功能包括了幫您產生及處理 form ,替 CGI 程式除錯,以及在不同的 forms 之間維系一個狀態值。 
CGI Lite 
這個輕量級的 module 是 CGI::* modules 之外的另一個選擇。它可算是在老舊的 cgi-lib.pl 之上改良、加料後的產物。 
以上者均有能力處理 multipart form 資料(即上傳)。 


--------------------------------------------------------------------------------

Q2.5: 為什麼這麼多 perl CGI libraries 都是 object-oriented (物件導向)的?我對用物件導向來寫程式一竅不通。難道就沒有簡單一點,給不會物件導向的人使用的 libraries 嗎?物件導向有多難?
其實使用物件導向的 modules 並不難。先去看看 Tom Christiansen 的 Easy Intro to Using Perl Objects (簡單介紹如何使用 Perl 物件)吧。 

前頭提到的 CGI modules 用起來真的是很容易!這裡有一個用 CGI Lite 印出 form 資料的實例*: 

【譯者】CGI.pm 的使用說明中有更多范例可供參考。 

#!/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';
    
    看著我做!
    
    

看著我做!


End_of_Header

print $form->startform;

## 產生一個單行輸入欄位 (text field)

print '姓名: ';
print $form->textfield('name'), "
\n";

## 產生一組單選按紐 (radio buttons)

print '

您住哪兒: 
';
print $form->radio_group(-name      => 'where',
                         -values    => ['北美洲',
                                        '南美洲',
                                        '歐洲',
                                        '澳洲',
                                        '亞洲',
                                        '南極洲'],
                         -default   => '北美洲',
                         -linebreak => 'true');

## 產生一個多行輸入欄位 (textarea)

print '意見: ';
print $form->textarea('comments', undef, 5, 40);

print "

";
print $form->reset;
print $form->defaults;
print $form->submit('送出!', 'Submit');
print $form->endform;

print "";

reset、defaults,及submit種方法( methods ) 會產 生不同的類型的按鈕。reset 這個按鈕讓您把目前 form 欄位中所填的資料洗掉, 並顯示屬於上一個狀態(或回合)的資料。 defaults 這個按鈕則是將form 欄位 資料徹底洗去。還有 submit 這個方法產生一個送出鈕以便讓人將資料送至 server 處。 

您看,不是很容易嗎? 
(http://www.fanqiang.com)
    進入【UNIX論壇


相關文章
Perl CGI 程式寫作常問問題集(4)安全 (2001-05-15 07:15:00)
Perl CGI 程式寫作常問問題集(4)程式設計疑難雜症 (2001-05-15 06:15:01)
Perl CGI 程式寫作常問問題集(3)CGI 與 WWW Server (2001-05-15 05:15:00)
Perl CGI 程式寫作常問問題集(2) Modules (模組) (2001-05-15 04:15:00)
Perl CGI 程式寫作常問問題集(1)入門簡介 (2001-05-15 03:15:01)
 

★  樊強制作 歡迎分享  ★