通常的Perl教程,在讲述CGI编程的时候,都是使用print直接输出HTML代码,好些的,会告诉你可以用here document方式写。但显而易见的是,在大型网站中,这样的写法难以实现设计与编程的分开。我们都知道,php或asp等会这方面有比较好的实现方法,如<? php> xxx <?>方式。那么,Perl又如何呢?
为达到这样要求,可以使用模板技术。这样,就能大量节省代码的编写量,提高代码效率,并且便于调试。以下内容大部分参考☞ 这里,但对于不明确的地方做了补充说明。
一、说明
一般,我们把常用的HTML代码放到后缀为“.html”的文件中作为模板,并将这些模板文件统一放在名为“templates/”的子目录下。然后在所写的Perl/CGI 程序中,使用这些HTML模板文件。另外,在你给模板文件命名时,尽量取些描述性强的名字。通常的命名方法是:下划线后面紧跟程序名,目的是用来区分常规的HTML文件和HTML模板。
一个典型的例子,比如 _header.html,存放网页头的一些公共信息;_footer.html 存放网页尾部相关信息。
※ 下面用一个比较简单的函数来实现模板中替换对应的变量值。更好的方法,可以使用HTML::KTemplate模块。
二、HTML模板文件
建立一个templates目录
# mkdir templates
然后创建两个基础HTML文件,注意:
2、<!– xxx –>是HTML的注释。
_header.html文件内容:
<!–_header.html–>
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<title>$title</title>
<link rel='stylesheet' href='style.css'>
</head>
<body>
_footer.html文件内容:
</body></html>
三、CGI脚本
该脚本放在:
/var/www/cgi-bin/scripts/script04
# tree
.
|– run.pl
`– templates
|– _footer.html
`– _header.html
脚本内容如下:
use strict;
#由于_header.html中已经提供了HTML header信息,所以,这里可以不用CGI模块
#use CGI qw(:all);
#这个变量的定义位置很重要,必须在Template函数之前定义,否则$title变量在函数中不能被引用
#我参考的原文没有明确这点,所以,当初我只使用了local的形式,而不是my定义方式
#当然,原文中可能Template函数是写在最后的,但我习惯了bash的写法
my $title = "Hello,World !";
sub Template {
my $file;
my $HTML;
$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+)/eval "$1"/ge;
#$HTML =~ s/\$(\w+)/${$1}/g;
return $HTML;
}
#注释该内容,以免与_header.html的内容冲突
#print header( -charset => "GB18030");
print &Template("templates/_header.html");
#这是网页的实际内容,这里用了另一种here document的写法
print <<EOF;
<a href="run.pl">$title</a>
EOF
print &Template("templates/_footer.html");
该程序中的大部分语句很简单,就是打开了一个模板文件,把其内容读出,并返回给程序。所用的技巧是其中的正则表达式,它是用来搜索HTML模板中的Perl变量, 把变量$title的值取代其符号表示。
当然,如果担心$符号在HTML或脚本中会引起冲突的话,也可以在HTML模板中使用如__string__或%string%的写法,适当的调整正规表达式的匹配项即可。
四、运行
1、直接运行
Content-type:text/html
<!–_header.html–>
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<title>Hello,World !</title>
<link rel='stylesheet' href='style.css'>
</head>
<body>
<a href="run.pl">Hello,World !</a>
<!–_footer.html –>
</body></html>
※ 注意$title已经被替换了。
2、浏览器显示