在Perl/CGI中使用模板
發表于:2007-06-11來源:作者:點擊數:
標簽:
編者按:如果你不打算使你的網絡應用系統出現混亂,那么就在Perl/CGI腳本中使用HTML模板吧,這樣可避免大量冗余HTML代碼的出現。 大部分網絡應用程序中用了很多HTML代碼。象Hotmail這樣的基于web的電子郵件系統,其中的登錄屏幕、郵箱、發送信息、文件夾、菜
<編者按:如果你不打算使你的網絡應用系統出現混亂,那么就在Perl/CGI腳本中使用HTML模板吧,這樣可避免大量冗余HTML代碼的出現。>
大部分網絡應用程序中用了很多HTML代碼。象Hotmail這樣的基于web的電子郵件系統,其中的登錄屏幕、郵箱、發送信息、文件夾、菜單條、設置選項和其它欄目都使用了HTML代碼。
網絡程序是可以使用HTML的,但問題是HTML出現的地方太多,程序的每個需要顯示的部分都需要設計HTML頁面。這些HTML代碼出現在哪里呢?就在你的Perl源碼中。這就意味著在你的程序中,將會插入數千行的HTML代碼,你的perl程序將會變得很難調試,在調試HTML的屏幕顯示時,也是困難重重,要是此時再換個其他人來編輯HTML,就更是雪上加霜,不用提有多混亂了。解決這些問題的辦法是:把HTML代碼放到后綴為“.HTML”的文件中去,作為模板,然后,在所寫的Perl/CGI 程序中,使用這些HTML模板文件。
為所有的那些HTML找一個新家
組織你的HTML模板的最好方法,就是讓它們盡量靠近你的程序的存放目錄。(要么同你的程序一起都放在同一目錄中,要么把模板文件放在名為“/templates/”的子目錄中。) 另外,在你給模板文件命名時,盡量取些描述性強的名字。我通常的命名方法是:下劃線后面緊跟程序名,目的是用來區分常規的HTML文件和HTML模板。
例如,如果要創建基于Web的電子郵件程序“Web Mail”,我們的模板就這樣命名:
_webmail_login.html # 登錄
_webmail_message_list.html # 顯示信件
_webmail_message_read.html # 閱讀信件
_webmail_message_send.html # 創建/發送信件
_webmail_message_erase.html # 刪除信件
_webmail_message_erase_confirm.html # 確認刪除
_webmail_logoff.html # 退出
一看文件名,我們就很容易知道該文件是做什么的。一段時間以后,回過頭來再作修改時,也不會搞錯。如果你是同其他網絡開發者協同工作,也不用擔心他們在修改時會把程序搞亂。
現在,我們開始著手把所有的HTML從Perl/CGI程序中移出去,放到HTML模板文件中,然后,還需要有個辦法把它們顯示出來。所以,我們將編制一個稱為&Template的Perl子程序,程序代碼如下:
sub Template {
local(*FILE);# filehandle
local($file);# file path
local($HTML);# HTML data
$file = $_[0] || die "Template : No template file specified\n";
open(FILE, "<$file") || die "Template : Couldn't open $file : $!\n";
while (<FILE>) { $HTML .= $_; }
close(FILE);
$HTML =~ s/\$(\w+)/${ $1}/g;
return $HTML;
}
該程序中的大部分語句很簡單,我們只是打開了一個模板文件,把其內容讀出,并返回給程序。所用的技巧是使用了下面的正則表達式,它是用來搜索HTML模板中的Perl變量, (如:“$date”) 把變量的值取代其符號表示。
$HTML =~ s/\$(\w+)/${ $1}/g;
其工作原理是這樣的:正則表達式搜索以“$”開頭的變量名,“\w”表示字符(a-z,A-Z,0-9 或下劃線),“+”意味著一個或多個字符?!癨w+”兩邊的括號表示要把匹配的變量名存到“$1”中,最后, “${ $1}”計算出變量的值。記住,變量名存放在$1中。下面為例子:
### 顯示登錄屏幕
print "Content-type: text/html\n\n";
print &Template("_webmail_login.html");
這樣,盡管HTML是存放在模板中,并不在你的程序里,變量值也可以算出來。
復雜的模板和HTML段
在某些場合,僅僅使用單一的模板還不能完成相應的任務,如在使用搜索引擎時,搜索結果往往情況各異,又比如,在做天氣預報的網頁時,你會根據預報的結果,來選擇相應的圖像和文本顯示。在這些場合,你可以使用多個模板文件來構成顯示屏幕。例如,你可以把下面的搜索結果放在頁面抬頭和腳注之間:
_search_results_header.htmlf # 頁面抬頭
_search_results_result.htmlf # 結果行
_search_results_footer.htmlf # 頁面腳注
上面的每個部分被稱為HTML片斷,因為它僅是一個完整的HTML頁中的一部分。我們把HTML片斷文件的后綴規定為“.htmlf”,這就可以同完整的HTML文件區分開來。通過把HTML網頁分解成HTML片斷,你就可以在屏幕上顯示出任何數量的搜索結果。
print &Template("_search_results_header.htmlf");
foreach $result (@results) {
print &Template("_search_results_result.htmlf");
}
print &Template("_search_results_footer.htmlf");
在我們天氣預報的例子中,也可以使用HTML片斷。同前面的例子相比,所不同的是,HTML片斷并不是一個接一個地顯示在屏幕上,而是在另外一個網頁中根據需要,加載相應的HTML片斷。比方說吧,我們的天氣預報的主文件模板為_weather.html,我們打算把未來三天的天氣預報插入到主HTML網頁上,我們引入變量“$day1 $day2 $day3”,對每一種可能的天氣情況,我們創建一個小的HTML片斷文件,然后,根據需要,進行加載。
### Load HTML fragments for weather forecast
$day1 = &Template("_weather_sunny.htmlf");
$day2 = &Template("_weather_cloudy.htmlf");
$day3 = &Template("_weather_snowing.htmlf");
print &Template("_weather.html");
在HTML文件中,對于變量的表示方法,對于程序員來說是很熟悉的。(如,“Today is $date”)。然而有些人則認為,如果使用其它符號來標識變量,而不是用“$”符號,感覺更容易些。即使你是第一次考慮用模板來代替程序行中的HTML代碼,此時你也僅需作很少的修改,就可以在程序中使用象“%variable%” ,“ __variable__”或采用其它你覺得有意義的符號。我認為通過使用模板,要作這些小修改不是很難的。
本文作者Dave Edis是Edis Digital公司的總裁,其公司位于加拿大,提供網絡媒體的解決方案。Edis Digital公司為世界各地的用戶開發基于Web的出版工具和應用程序。