怎样利用Perl研发Internet/Intranet应用之二
来源:linux宝库作者:linux宝库 发布时间:2007-09-30 00:00:00


三利用Perl研发Internet/Intranet应用的方法和技巧
----1 Perl5.0的某些语法
----为了方便大家对后面内容的理解,在这里先介绍一些perl5.0的基础知识。
----1)变量(对象)的表示方法:前面以$打头,如:$db,$bcd
----2)普通阵列的表示方法:前面以@打头,如:@value
----读取方式:$value[0],$value[1]...
----3)相关阵列的表示方法:前面以%打头,如:%value
----相关阵列和普通阵列没有什么不同,差别只在他的索引值是用字串,而非一般常用的整数值。
----读取方式:$value{$string1},$value{$string2}...
----4)读写文档用open命令
----如:open(INPUT,"< zyr.txt");
----读文档用“< ”、写文档用“ >”、追加文档用“ > >”
----2 强大的字串处理功能
----在前面已提过perl具备很强大的字串处理功能,他除了提供一些字符运算比较符(eq,ne,le...)外,还提供了大量针对字符串匹配的参数。这是其他一些cgi编写语言所不具备的。
----我们经常会碰到,传递的参数是中文信息,但接收到后却都是乱码。这是什么原因呢?我们都知道,一个中文占用2个字节,而一个英文字母只占用1个字节,unicode编码除外(unicode是Microsoft提出的标准,采用16位同时对中英日韩等多国文字进行编码的机制)。server接收到参数信息后,会以字节为单位把每单位信息转换为两个十六进制数,这时候,中文的高字节会被转换为"%**",而低字节也被转换为"%**"。假如使用perl,该参数信息很容易就能被还原出来。
...
$info=$ENV{’QUERY_STRING’};
#读取参数信息到变量$info中
$info=~s/%([\dA-Fa-f][\dA-Fa-f])
/pack("c",hex($1))/eg;
----该语句的语法含义是:s是取代的意思;"/"中的内容是要找的格式(“=~”是一些特别字符,具体含义见表一);%([\dA-Fa-f][\dA-Fa-f])表示以%开始,后连续跟着两个十六进制数的字串(\dA是一些字符匹配格式,具体含义见表二),找到该字串后,系统把该值存放在$1中;pack("c",hex($1))表示把$1中的数转换为真正的十六进制字串;e表示把整个要替换的字串当做表达式;g表示整个字串都要做相应的查找替换。
----除了转换中文参数外,我们还经常要面对查找、替代诸如log文档、邮件等大量信息的困难;假如使用perl提供的一系列参数,将省去很多不必要的麻烦。限于篇幅关系,下面仅列出一些常用的参数。
----表一:
=~寻找给定字串的特别格式
m取消//内“^”、“$”的特别含义
i字串匹配时不考虑大小写
x字串匹配时不考虑空格
s取代的意思
表二:
\w匹配一个文字或数字字符,包括“_”
\W匹配一个非文字/数字字符
\s匹配一个空白字符,包括“space”、“tab”键入的字符
\S匹配一个非空白字符
\d匹配一个数字字符
\D匹配一个非数字字符
\b匹配一个二进制字符
\B匹配一个非二进制字符
\A仅从字串开始进行匹配
\Z仅从字串最后进行匹配
\G表示m/结束
----3 图像文档的处理
----虽然client经常向服务器申请的都是text/html文档,但是服务器也能够回送GIF、JPG等图像文档,我们只需在数据的header中指明即可。假如我们用< imgsrc="http://10.0.0.1/Scripts/te.pl" >语句调用CGI程式,向服务器申请一个GIF文档,则服务器收到请求后会以二进制码的形式回送一个GIF的图像文档给client。te.pl源程式如下:
#!/bin/perl
#假如该路径已加入PATH中,上句可省
$MY_FILE_NAME=’c:/InetPub/wwwroot/photo/1.gif’;
#图像文档存放的路径
$CHUNK_SIZE=4096;
#假如图像文档较大,该值可相应取大一些
#header
print"HTTP/1.0200OK\n";
print"Content-type:image/gif\r\n";
print"\r\n";
#假如传输的图像文档为JPG文档,
只需把"image/gif"改为"image/jpeg"
open(MY_FILE,"< $MY_FILE_NAME")
ordie("Can’topen$MY_FILE_NAME:$!\n");
binmode(MY_FILE);
binmode(STDOUT);
#配置传输模式为二进制代码
while($cb=read(MY_FILE,$data,$CHUNK_SIZE))
{
print$data;
}
close(MY_FILE);
----4 怎样实现服务器重导
----服务器重导也就是ServerRedirection。我们不但能够利用CGI程式产生虚拟文档,还能够需要服务器送出一个已存在的文档(该文档能够是本服务器的,也能够是网上任意的页面),这就是服务器重导。详见下图:
1请求2
------ >---- >
4服务器重导3
client< ------server
< ----CGI(Application)
5产生虚拟文档
< ----
----做法是:在CGI程式中不要header(即不要print"HTTP/1.0200OK\n";print"Content-Type:text/html\n\n";这两行)和多加一行print"Location:http://***","\n\n";即可。(http://***为任意的url地址)
----源程式为:
----#!/bin/perl
----print"Location:http://***","\n\n";
----另外,可用JavaScriptForclient的语句书写,但含重导语句的页面需先出现,会有闪烁的效果。附程式如下:
< Script >
Location.href="http://***";
< /Script >
----5 怎样在程式中调用系统命令
------以在程式中自动收发邮件为例
----CGI的推出就是为了使WebServer能够和更多的数据源沟通,常用的数据源有三种:数据库、非关系型数据文档(如txt文本)、邮件系统。前二者的连接和读写都有很多的方法,这里就不再相述。我主要想谈谈在CGI程式中怎样才能读取到邮件系统的邮件,自动发送邮件又是怎样进行的。Microsoft最近推出了ADO(ActiveXDataObject),只要相应数据源能提供OLEDB(DataProviderInterfaces),我们的应用程式就可调用ADO透明的访问该数据源(包括前面我们提到的三种数据源)。这种应用在邮件系统方面现在还只限于在MicrosoftExchangeServer上,由于这是新标准,实用和否还要看数据源供给商的反应和是否提供OLEDB接口。下面,我给大家介绍另外一种较为通用的实现方法。
----读取邮件:在很多unix系统中,邮件一般都放在/var/mail目录下,每个用户的邮件就存放在一个以该用户名命名的文本文档中,例如:/var/mail/zyr。假如我们要读取或查找该邮件信息,只要打开相应的文档即可。但该程式的运行者须有读取该用户邮件的权限,可在系统中用命令chmod进行配置。下面以一个perl程式为例:
----#该程式用于读取邮件,假如成功就把每一行数据打印出来
#!/bin/perl
#假如该路径已加入PATH中,上句可省
$mail_path="/var/mail/zyr";
#邮件路径
if(!open(vmail,"< $mail_path")){
print"can’topen$mail_path";
exit;
}
else{
while($temp=< vmail >){
#取出每一行数据放在$temp中
print$temp;
}
}
close(vmail);
----发送邮件:可通过调用系统命令实现,如system"mailxzyr\@gznet.com< a.txt"或exec"mailxzyr\@gznet.com< a.txt"。(a.txt为要发送的邮件内容,""是取消@特别字符的含义)前者系统命令运行完后,会继续执行下面的语句;而后者调用结束后,整个程式就会结束,原来的perl程式也不能继续执行。故一般后者通常放在程式最后一行执行。
----6Server和Client传递数据的方法
----很多人都知道由client传送数据到server可通过下面两种方法,
1)< formmethod="GET/POST"
action="http://10.0.0.1/Script/a.pl" >
< inputtype="hidden"name="a"value="1" >
< inputtype="hidden"name="b"value="2" >
< inputtype="submit"name="submit"value="Go" >
< /form >
2)< ahref="http://10.0.0.1/Scripts/a.pl?a=1&b=2" >
CGI< /a >
----结果也是相同的;但却很少有人会去想这两种方法传输数据时用的是哪种方式。其实,前者采用的方式在method中配置能够是GET也能够是POST,而后者采用的则是GET方式。GET和POST的区分在于,假如以GET方式传输,所带参数附加在CGI程式的URL后直接传给server,并可从server端的QUERY_STRING这个环境变量中读取;假如以POST方式传输,则参数会被打包在数据报中传送给server,并可从CONTENT_LENGTH这个环境变量中读取出来。更有一种情况是,您用的是GET方式,但传送的参数是路径,如:
----< ahref="/cgi-bin/a.pl/usr/local/bin/pine" >CGI< /a >
----这时所传递的参数"/usr/local/bin/pine"存放在PATH_INFO这个环境变量中。环境变量的读取方式为$str=$ENV{’QUERY_STRING’};
----有时候我们很希望能记录下访问我们页面的用户所用的浏览器是什么?名字、地址又是什么?这时候我们就要借助server端的一系列环境变量了。下面列出其他一些常用的环境变量。
SERVER_NAMEserver的机器名称或IP地址
SERVER_PORTserver正在运行的端口号
REQUEST_METHOD发出request的方法(GET/POST/HEAD)
SCRIPT_NAME程式被调用的路径,如:cgi-bin/a.pl
REMOTE_HOST发出request请求的远端机器(client)的名称
REMOTE_ADDR发出request请求的远端机器(client)的IP地址
REMOTE_IDENT发出request的使用者名称(如是拨号上网,则为用户
ID),当NCSAIdentityCheck为enabled,而且client
机器支持RFC931时,该变量有效
CONTENT_TYPE数据的MIME型别,如:"text/html"
HTTP_ACCEPTclient能够接受的MIME型别列表
HTTP_USER_AGENTclient发出request的浏览器类型
HTTP_REFERER在读取CGI程式之前,client所指的文本URL
----以上环境变量并非任何webserver都支持,需视具体情况而定,建议使用之前先进行测试。
----下面有一个例子,作用是把访问本页面的客户的ip地址和所用的浏览器类型记录并显示出来。
print"HTTP/1.0200OK\n";
print"Content-Type:text/html\n\n";
print"< HTML >\n";
print"< HEAD >\n";
print"< TITLE >test< /TITLE >\n";
print"< /HEAD >\n";
print"< BODY >\n";
print"YourIPAddressis$ENV{’REMOTE_ADDR’}.\n";
print"YourBrowseis$ENV{’HTTP_USER_AGENT’}.\n";
print"< /BODY >\n";
print"< /HTML >\n";
|
还没有关于此文章的相关评论!