Mar 12

[原]perl CGI 配合HTML模板使用 阴

    通常的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目录

# cd /var/www/cgi-bin/scripts/script04/
# mkdir templates

然后创建两个基础HTML文件,注意:
引用
1、Content-type:text/html一行必须在文件的开头,并且下面留空一行,(这样,就可以不用CGI的header函数了);
2、<!-- xxx -->是HTML的注释。

_header.html文件内容:

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>$title</title>
        <link rel='stylesheet' href='style.css'>
</head>
<body>

_footer.html文件内容:

<!--_footer.html -->
</body></html>

三、CGI脚本
该脚本放在:
引用
# pwd
/var/www/cgi-bin/scripts/script04
# tree
.
|-- run.pl
`-- templates
    |-- _footer.html
    `-- _header.html

脚本内容如下:

#!/usr/bin/perl -w
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、直接运行
引用
# perl run.pl
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、浏览器显示
点击在新窗口中浏览此图片
HTML源码:
点击在新窗口中浏览此图片
3、源码下载

五、参考资料
http://www.cndw.com/tech/perl/2006032926315.asp
http://blog.chinaunix.net/u/6542/showart_69919.html
HTML::KTemplate模块:
http://html-ktemplate.sourceforge.net/
http://search.cpan.org/~kasper/HTML-KTemplate-1.33/KTemplate.pm
原文中提供了一个bash script的写法:

#!/bin/sh
function template () {
    file=$1
    [ -z "$file" ] && die "No template file specified."
    eval echo -e "\"`cat $file`\""}

title="Hello, world !"
template "templates/_header.html"
<your body code here ...>
template "templates/_footer.html"

发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]