文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>perl5中文教程 16

perl5中文教程 16

时间:2007-03-09  来源:darrenshen

http://www.8esky.com/cms/Site/Article/wlbch15/perl408/51873.html   应用第1章 cgilib例

by flamephoenix

一个简单的读取并处理表格请求数据的cgilib.pl例子:

#!/usr/bin/perl

sub readGetData{
    # 指定局部变量queryString用以保存和传递函数的参数
    local(*queryString) = @_ if @_;
    # 读取环境变量QUERY_STRING的值赋给变量$queryString
    $queryString = $ENV{"QUERY_STRING"};
    return 1;
}

sub readPostData{
    local(*queryString)=@_ if @_;
    local($contentLength);
    # 读取环境变量CONTENT_LENGTH的值
    $contentLength = $ENV{"CONTENT_LENGTH"};
    # 检查是否有数据
    if($contentLength){
        # 从设备STDIN读取contentLength长度的字符赋给$queryString
        read(STDIN,$queryString,$contentLength);
    }
    return 1;
}

sub readData{
    local(*queryString) = @_ if @_;
    # 读取环境变量REQUEST_METHOD
    $requestType=$ENV{"REQUEST_METHOD"};

    # 如果请求方式为GET则使用函数readGetData
    # 否则如果请求方式为POST则使用函数readPostData
    if($requestType eq "GET"){
        &readGetData(*queryString);
    }
    elsif($requestType eq "POST"){
        &readPostData(*queryString);
    }
    return 1;
}

sub DecodeData{
    local(*queryString)= @_;
    # 把加号转换成空格
    $queryString=~s/\+/ /g;
    # 转换十六进制字符
    $queryString=~s/%(..)/pack("c",hex($1))/ge;
    return 1;
}

sub parseData{
    local(*queryString,*formData) = @_ if @_;
    local($key,$value,$curString,@tmpArray);

    # 以&为分隔符把字符串转换成键-值对
    @tmpArray = split(/&/,$queryString);

    # 在数组@tmpArray内循环
    foreach $curString(@tmpArray){
        # 以=为分隔符分开键-值对
        ($key,$value) = split(/=/,$curString);
        # 解码
        &DecodeData(*key);
        &DecodeData(*value);
        # 把键和值加到字典中
        $formData{$key}=$value;
    }
    return 1;
}

1;
#end of file cgilib.pl

使用方法:

要使用此库需含下列语句:
#require "cgilib.pl";
表格数据处理:
%dataDict=();
&readData(*data);
&parseData(*data,dataDict);
字典数据处理:
while(($key,$value)=each(%dataDict)){
    print $key,"=",$value,"\n\n";
}

第二章 动态创建图象(未定稿)

by flamephoenix


    “动态文档”不仅指文本,CGI程序可以创建图象、声音等各种媒体。你只须输出相应的MIME头、一行空行及原始数据即可。
    下例的image.cgi将装载一个GIF图像文件并送到浏览器显示:

#!/usr/bin/perl

$file = '/usr/local/etc/httpd/htdocs/images/picture.gif';

print "Content-Type: image/gif\n\n";
open(GIF,"<$file") || die "Can't open GIF\n";
while (read(GIF,$buffer,16384)) {
   print $buffer;
}

    image.cgi首先发送MIME头说明(Content-Type),然后读取文件内容并输出。这段程序对$file变量和Content-Type类型略加修改就可以发送声音或影像文件。
    那么怎样把CGI程序创建的图像嵌到页面中呢?SSI是不行的,方法是用<img>标签,语法如:
    <img src="/cgi-bin/image.cgi">
    仅就显示picture.gif这幅图像而言,用上述的image.cgi是没有什么意义的,更恰当的方式是这样使用:
    <img src="/images/picture.gif">
    但是,image.cgi可以扩展功能来做更多的事。例如它可以从多个图像文件中随即地选择一个来显示,那么,每一次访问该页面时都会出现不同的图像。
    计数器程序通常利用<img>标签的这一特性,尤其是那些不允许解析HTML和SSI的服务器特别实用。服务器端不解析HTML文件可以降低服务器的负载。
    此外,除了简单的装载并显示已有的图像文件外,可以真正的动态生成所需的图像。你可以设计一个CGI程序根据不同的参数及用户定义的一些细节来实时创建相应的图像(如图表)并显示。这种程序的复杂性在于图像的生成而不在于将图像输出给浏览器。幸运的是,有一些库提供了这样的接口,如Thomas boutell的gd图像库,这是生成GIF图像的一个出色工具,可以从http://www.boutell.com/gd/来下载。它是用C语言写的,但是有Perl接口库gd.pm,还有基于gd支持多种语言的接口库tgd和fly。详细情况见上述gd主页。
    下面是一个简单的用位图动态生成图像的计数器程序,对理解上述描述应该会有所帮助。(源代码下载)
    您是第位访问本网页的人。

附:GIF的说明
    现在流行着一种趋势,即远离GIF格式而采用Portable Network Graphic格式(PNG),这种变化出于技术和法律两个方面的考虑。1995年1月1日,Unisys声称他们有权要求使用LZW压缩算法的软件公司要经过他们的许可或付给他们报酬,因为他们拥有专利使用权。而GIF格式正是使用这种算法。所以,你所编写的任何用于商业应用程序中的GIF图像(包括以CGI/WWW为基础的那些文件),都必须购买许可证或支付费用。许多软件包不再压缩GIF文件(这样会使图像变得很大),或者把GIF文件及其支持软件全部去掉。PNG使用非专利的压缩算法,从而避免了这些麻烦。在技术方面,PNG提供了较好的压缩算法(无损失,像GIF一样,但不像JPEG。JPEG在压缩时会丢失数据)、二维交互以及24位和48位真彩支持。现在,很少有浏览器支持内插的PNG图像,但不久的将来,这种情况很可能会改变。GD图形库文件说明了PNG支持即将来临。

 

相关阅读 更多 +
排行榜 更多 +
无限Fps

无限Fps

飞行射击 下载
幸存者时间僵尸

幸存者时间僵尸

飞行射击 下载
金属兄弟Metal Brother

金属兄弟Metal Brother

冒险解谜 下载