⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 用perl生成wml(转自httplyy00.yeah.net).txt

📁 C&C++论坛精华
💻 TXT
字号:
作者:asp2001
email: asp2001@163.net
日期:2000-08-03 20:53:04
最简单的方法 
# 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\">";

.... < more perl code for printing out WML statements > ...


检测浏览器类型 
#! /usr/bin/perl
use CGI;
$q = new CGI;
if ($q->user_agent() =~ /Nokia/)
{
# WML for Nokia here
}
else
{
# other WML here
}


Perl编程 
这个教程是为以下开发者准备的: 
知道如何编写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";
	
 # Start creating the view card
 
 my $view_card = '<card title="All names in directory" id="view"> 
 <p>
 Click on a name for more info<br/>';

 # We'll use this in a minute
 my $all_info_card;
      
    
   

这里我们已经创建了一个字符串,它将作为我们的标题卡片。当然还有我们需要创建的动态ID。(我选择‘a’既然这是一个简单的字符,可以很容易地增加。)既然每个记录都有唯一的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的 .= operator ,函数返回的字符串将不断地扩充。

  	
# 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的数值,因此,我们在这个函数中所做的只需要返回一个新的卡片就可以了。

这就是全部,你现在有了一个动态的电话本。当然这个教程不是一个很好的解决办法,至少他需要一个人手工来修改txt文件。另外,WML页面有大小的限制。但是无论如何,以上就是全部的过程。

制作人:罗堃

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -