文章系统图片系统下载系统个人求职企业招聘房产系统展会系统供求系统产品系统商城系统自定义系统后台一览
解决方案
建站知识
WAP建站入门教程
来源:网络作者:网络

对于Perl编程,其基本原理符合CGI编程原理。先看下面的程序片段:

# HTTP header with correct MIME type
print "Content-type: text/vnd.wap.wml\n\n";

# WML starts here with the correct XML doc type declaration
print "<?xml version=\"1.0\"?>";
print "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\"";
print "\"http://www.wapforum.org/DTD/wml_1.1.xml\">";
……
更多的Perl 代码,输出WML页面内容。
……
    按照以上的程序开头便可以输出动态的WML页面。下面有一段更详细的教程,这个教程是为以下开发者准备的:
    • 知道如何编写WML页面和卡片,并且了解自己的工作。
    • 知道如何配置自己服务器,使之能够运行Perl。
    • 有CGI的基本知识,并且了解Perl的语法。
    从表面上来说,使用CGI来产生WML页面和产生HTML页面没有太大的区别。一旦读者仔细地看一下,就会明白WML所包含的新内容的确还是与其他的页面动态生成有所不同。
    假设,老板需要做一个可以通过电话来访问电话目录。公司现在只有两个职员,但是将要不断扩大。因此,肯定不会去做一个固化的目录。相反将把数据保存在一个文本文件中,通过动态生成WML页面的来显示信息。
    首先,将要建立一个“people_data.txt”,如下所示:
# Format is:
# Name|phone num|fax num|Title
Linus Smith|123-4567|098-7654|Director of OS Development
Jane Doe|123-4568|098-7655|Senior VP of OS Research
    可以看出“|”符号是用来区别字段的。“#”是用来表示注释的。这些字符没有其他的意义,仅仅是一般的转换。
    下面,需要决定最后的WML文件将是什么样子。在同老板商量之后,决定如下:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card title="Telephone Book" id="index">
    <p>
        Welcome to Widgets Inc. Telephone Book
        <a href="#view">Click to view list</a>
    </p>
</card>
<card title="List of Names" id="view">
    <p>
        <a href="#linus_info">Linus Smith - 123-4567</a>
        <a href="#jane_info">Jane Doe - 123-4568</a>
    </p>
</card>
<card title="Info for Linus Smith" id="linus_info">
    <p>
        Director of OS development
        Phone number: 123-4567
        Fax number: 098-7654
    </p>
</card>
<card title="Info for Jane Doe" id="jane_info">
    <p>
        Senior VP of OS research
        Phone number: 123-4568
        Fax number: 098-7655
    </p>
</card>
</wml>
    每当增加新成员的时候,都不得不重新修改文件。这不是一个好办法。但是如果向文本文件中增加内容,那将是一个不会编写WML页面的程序员也会的事情。为了实现这个目标,使用以下的脚本:
#!/usr/bin/perl –w
use strict;
use CGI qw/:standard/;

# Our CGI object
my $q = new CGI;
    以上的内容是设置Perl环境。使用CGI模块来进行HTTP数据显示和处理。然而在这个例子当中,将使用尽量少的CGI模块,读者将会在将来的教程当中明白处理服务是多么的复杂。
# data file to get info from
my $data = "people_data.txt";

# Template for the title card
my $title_card = qq (
<card title="Telephone Book" id="index">
<p>
Welcome to Widgets Inc. Telephone Book<br/>
<a href="#view">Click to view list</a>
</p>
</card>
);

# Initial id of the first record
my $id = "a";
    这里已经创建了一个字符串,它将作为标题卡片。当然还有需要创建的动态ID。(选择‘a’,是因为它是一个简单的字符,可以很容易地增加)既然每个记录都有唯一的ID(因此可以把它作为头一个卡片)。ID将从‘a’开始,然后每找到一个新记录就增加一个。要一次性将所有的名字都生成卡片。然后使用一个初始化的缓冲区来显示成员的数据内容。
# Now iterate over the
data file building data dynamically
open(FILE,"$data") || die "Can't open $data: $!\n";
while (<FILE>) {
chomp;
next if (/^\#/);
my ($name, $phone, $fax, $position) = split(/\|/);
    打开自己的文件(当然要检查打开权限,保证能够打开),现在就可以读取了(注意:要跳过以“#”开头的行)。其他的部分,只需要从已经定义和产生的文件中读取就可以了。显然在读取的过程当中,需要做一定的检查,保证每个部分的确有数据。
# Build up the view card
$view_card .= build_view_card($name, $phone, $fax, $position);
# Build up info cards
$all_info_card .= build_info_card($name, $phone, $fax, $position);
}
    这里,将从文件中提取的数据传给两个函数。他们将返回由这些参数所确定的卡片。注意到Perl的“.= ”操作符,函数返回的字符串将不断地扩充。
# Finish off the card

$view_card .= "</p> </card>";

my $header = qq (
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml.xml">
);

# Template for the entire deck
my $deck = qq(
$header
<wml>
$title_card
$view_card
$all_info_card
</wml>
);
print $q->header('text/vnd.wap.wml');
print $deck;
    这里非常简单地将他们绑在一起。打印文件头,建立卡片,并且将他们动态地放在一起。当做好这一切之后,需要输出一个Content-type头        text/vnd.wap.wml。
    现在来看一下建立卡片的两个子过程:
sub build_view_card {
$id++;
my ($name, $phone, $fax, $position) = @_;
my $info_item = qq (
<a href="#$id">$name - $phone</a><br/>
);
return $info_item;
}
    这个代码将接收信息,并把这些信息插入到一个简单的模板里面。一个非常重要的一点是每次都在增加“$id”变量的数值。这个保证每个记录都有唯一的id号。Perl允许直接使用“++”操作符,使得从‘a’增加到‘b’。
sub build_info_card {
# Template for card showing info for a single person
my ($name, $phone, $fax, $position) = @_;
my $info_card = qq (
<card title="Info for $name" id="$id">
<p>
$position<br/>
Phone number: $phone <br/>
Fax number: $fax <br/>
<do type="prev"><prev/></do>
</p>
</card>
);
return $info_card;
}
    在这个子过程当中,做了和前面一样的事情,只不过用了不同的模板。注意到已经在前面的函数中增加了“$id”的数值,因此,在这个函数中只需要返回一个新的卡片就可以了。