當前位置:開發者網絡 >> 技術教程 >> CGI教程 >> CGI文檔 >> 內容
精彩推薦
分類最新教程
分類熱點教程
    
在Perl/CGI中使用模板
作者:未知
日期:2003-09-13
人氣:
投稿:Andy.m(轉貼)
來源:未知
字體:
收藏:加入瀏覽器收藏
以下正文:
在Perl/CGI中使用模板
作者: Dave Edis
日期: 2000年03月31日
from:(www.zdnet.com.cn)


<編者按:如果你不打算使你的網絡應用系統出現混亂,那麼就在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的出版工具和應用程序。




相關文章: