来源:远方网络 | 2005-4-17 5:56:12 | (有2828人读过)
PERL CGI简介及指令示范 本文出自:http://www.01-world.com 作者: 蔡奇玉、连振汉、张志强 (2001-08-22 12:00:00) 摘自蔡奇玉、连振汉、张志强著《CGI编程指南》第六章 为尊重作者版权,只作部分节选,以作推介之用, 推荐您购买原书阅读!
6.1 Perl语言简介 6.2 如何使用Perl来写程序 6.3 Perl语法介绍 6.3.1 Perl语言的变量 一、纯量变量(Scalar Variables)的用法 二、数组(Arrays)的用法 三、关联数组(Associative arrays)的用法
6.3.2 Perl在CGI程序设计中常用的函数 # print printf chop split keys values reverse sort length substr index push pop unshift shift join grep hex rand localtime die open close pack read exit
6.3.3 Perl语言的运算符号字符 一、赋值(Assignment)运算符 二、算术(Arithmetic)运算符 三、数值(Numeric Values)关系运算符 四、字符串(StringValues)关系运算符 五、逻辑(Logical)运算符 六、其他常用的运算符
区块运算符 条件运算符
七、常用的文件数据(File test)运算符
6.3.4 Perl语言的流程控制 一、选择性流程控制
if 假如 unless 假如非
二、循环流程控制
while 当 do while 当.. untile 直到..才 do until 直到..才 for 循环陈述 foreach 循环陈述 last 退出循环陈述 next 到循环的下一个陈述
6.3.5 Perl语言的文字处理模式 一、文字处理(RegularExpression)的常用语法 二、文字处理模式(RegularExpression)的简单范例 三、文字处理模式(Regular Expression)相关的运算符及函数
/pattern/文字运算 =~相配运算符 !~不相配运算符 tr转换函数 s取代函数
6.4 Perl for Win32 简介
6.1 Perl语言简介
Perl(Practical Extraction and Report Language)叫做文字分析报告语言。是由劳利·华尔(Larry
Wall)所建立出来的语言。他设计Perl时的哲学是以实用为第一优先,也就是语言容易使用,有效率,而且完整。Perl语言中包含了C、C++、shell
script、sed、awk这几个语言的语法,它原始的目的就是用来取代UNIX原来sed/awk与script的组合,用来汇整信息,产生报表的一个工具程序语
言。且随着版本的改进,功能越来越强,现在的功能已经超乎原先设计时的想象,几乎任何事都可以做到,也变成每一部工作站必备的标准工具了
。因为它对字符串与数据剖析方面有很强的处理能力,尤其是利用关联性数组来作CGI应用程序剖析输入数据串,可以说是一个功能强大的语言! Perl这个解释式的语言对国内的使用者来说可能都很陌生,甚至可能听都没听过,为什之要用Perl来写CGI应用程序呢?因为Perl有很强的字
符串处理能力,在国外很多处理数据库的软件可以用Perl来沟通。在Perl5.0版本中还增加面向对象的用法、增加对字符串的处理能力、可以把
整个文件当成一个字符串来处理、不受任何数据的大小限制而只受存储器的大小、能够处理DBM数据库格式的数据也能够处理二进制的数据等等
,更重要的是Perl还可以在Unix、WindowsNT、Windows95、Dos、Linux、FreeBSD、OS2、Macitosh等操作系统中使用。目前还可以用Perl来和一
些数据库软件沟通,在国外一些功能强大的CGI应用程序几乎都是用Perl语言来当主角!读者看到这里一定会觉得功能这样强大的语言Perl一定很
难学!这您就大错特错啦,Perl是很容易上手的,它的语法和C语言很接近,对于原本熟悉C语言的人来说,Perl是很容易上手的,只要有一点C语言的
基础,再加上几个小时的学习时间就可以很轻易地用Perl语言写一个简单的CGI应用程序,至于那些没有C语言基础的人,只要多花一点时间来学习
,也是可以很快地使用Perl语言来写CGI应用程序!那时候,您就会发觉原来Perl是那么的平易近人,而写出来的CGI应用程序也是那么地简洁有力,
笔者相信Perl语言在CGI程序设计的舞台上一定是扮演着最佳男〈女)主角的角色。 在本章中先介绍Perl语言的语法,而在下一章中会介绍如何在Unix操作系统下使用Perl来写CGI应用程序,最后会在第8章中介绍如何在Windo
ws95、WindowsNT这些32位操作系统中使用Peri来写CGI应用程序。求知心切的您,是不是迫不急待地想知道Perl的功能是多么的强大呢?
6.2 如何使用Perl来写程序
如果在系统中已安装了Perl的话,我们可以用“which perl”,或是“which perl5"这个指令来得知Perl是位于系统的哪一个目录下。 %which perl /usr/bin/perl 或是 %which perl5 /usr/locaiAin/per15 之后就可以利用Perl来写程序码了。如果想知道Perl版本的话,可以用“perl-v”或“perl5-v”,这个指令来得知Perl的版本。目前Perl的
最新版本是5.x版,而以下所介绍的语法指令都可以在Perl4和Perl5版本中执行。如果不幸在工作站上找不到这个软件的话,可以向系统管理员要
求安装这个非常实用的软件。 接下来可以在工作站使用系统的文书编辑器(例如:vi、Joe、pico等等)来编辑程序码,在程序码的第一行一定要加上#!/path/per1程序起头
宣告。例如,用“which
perl"这个指令来得知/usr/bin/perl这个路径文件名,所以在写程序码的时候,一定要在程序码的第一行写上#/usr/bin/perl这一行程序起头宣
告,这样系统才知道要到哪一个路径下用哪一个执行文件来执行这个写好的程序码,接下来就可以在这个文件中写程序码了。这是Perl语言(解释
式)和C语言(编译式)在程序写作中最大的不同点。在C语言中是把原始程序码编译而成一个执行文件就可以在系统中执行,而Perl语言就要在原
始程序码的第一行使用#!再加上Perl的绝对路径和文件名称,以便告诉系统要使用Perl这个解释器来解释这些原始程序码。 在写完程序码之后,一定要把文件属性改成可执行,例如可以把文件属性更改成每个人都可以执行(chmod 711 filename)。不过,一般我们在
写CGI应用程序的时候,为了避免其他错误的发生,最好把CGI应用程序的文件属性更改成每个人都可以有读取、执行的权利(chmod 755
filename)。 而#这个符号在Perl语言程序码中是代表注解的意思,Perl不会去处理这一行的叙述,所以在以下的范例中,如果出现这个符号的话,是代表笔
者对于程序码的说明,在此先向读者说明一下。
6.3 Perl语法介绍 为了让大家对Perl语言有更深刻地了解,在介绍CGI应用程序之前,先来介绍Perl的基本语法,笔者先在本章中简单扼要地替大家介绍Per1语
言在CGI程序设计中最常用的语法函数,希望大家在看完这一章节之后,能够了解Perl语言是这么容易上手。只要把这些基本语法熟悉之后,就可
以得心应手地用Perl来写CGI应用程序。
6.3.1 Perl语言的变量
Perl的变量基本上有三种即纯量变量(ScaiarVariable)、数组(Array)、关联数组(Associative array),而以下是这些变量的使用方法:
一、纯量变量(Scalar Variables)的用法 在Perl语言中变量的使用不像在C语言中还要事先宣告,在使用纯量变量的时候要先加上$这个符号,要注意的是如果指定的纯量变量是一个
字符串的话,就要加上""这个双引号符号了。如果是一个数值的话,就不用加上""这个符号了。以下是一些范例:
$Strl=www"; #将www这个字符串指定给$Strl这个纯量变量; $str2="cgi"; #将cgi这个字符串指定给$str2这个纯量变量; $str3=$strl.$str2; #.就是把两个字符串连起来,所以 $str3="wwwc20"; $int=5; #将5这个数字指定给$int这个纯量变量;
$int=3+2; #此时$int=5; $int=3*2; #此时$int=6; $int=l0;$int++; #此时$int=10+l=11; $int=l0,$int+=5; #此时$int=10+5=15; 二、数组(Arrays)的用法 在使用数组的时候要先加上@这个符号,以下是一些范例: @namel=("tom","mary"); #将"tom","mary"这两个字符串指定给数组 @name1 @name2=@name1; #此时的@name2=("tom","mary") @pame3=("john",@name1); #此时的 (name3=("john","tom","mary") ($one,@name4)=@name3; #此时的$one="john",而 @name4=("tom"'"mary") @namel=0; #此时@name1为一个空数组 @int=(1,3,5,7,9); $x=@int; #将一个数组指定给一纯量变量,就会返回数组元 #素的个数,所以此时的$x=5 $x=$#int; #$#这个变量会返回数组最后一个元素的index #所以此时$x=4 ($x)=@int; #$x等于数组@int的第一个元素的值, #所以此时$x=1 $b=$int[0]; #$b等于数组@int的第一个元素,所以$b=1 $C=@int[0]; #$c也是会等于数组@int的第一个元素,所以 #$c=1,因此要呼叫数组中的值有以上两种方法 $int[0]=2; #将2这个数值指定给数组@int的第一个元素 #此时@int=(2,3,5,7,9); $int[0,1]=[1,3]; #将1指定给数组@int的第一个元素,且将3指 #定给数组@int的第二个元素的,所以 #此时@int=(1,3,5,7,9); @int[0,1]=@int[1,0]; #将数组@int的前两个元素交换 #此时@int=(3,1,5,7,9) ($int[0],$int[1]) #也是将数组@int的前两个元素交换 =($int[l],$int[0]); #此时@int=(1,3,5,7,9); @data=@int[0,l]; #此时@date=(1,3); $int[5]=11; #将11这个数值指定给数组@int中第六个元素 #此时@int=(1,3,5,7,9,11) 三、关联数组(Associative arrays)的用法 关联数组也是数组的一种,是由不同的纯量变量所组成。不过和数组不同的地方是在关联数组中的元素是由成对的key-value所组成的,也就
是每一个key都有一个相对应的值(value),这是在Perl语言中特有的语法,所以初学者对于关联数组可能会比较陌生一点,笔者会在这里作比较详
细的说明。如果能够将关联数组的语法应用在CGI程序设计中,就会发现关联数组是一个很好用的语法。 在使用关联数组的时候要先加上%这个符号,而关联数组的格式如下: %ARRAY=(keyl,value1,key2,value2,key3,value3...); 每一个key都有一个相对应的值(value)。 l.在关联数组中增加、更改一对数据: $ARRAY{key}=value; 在关联数组ARRAY中加上一对key-value,要先在关联数组名称前加上$这个符号,而且key的名称要在{}符号之间,最后再指定key所对应的val
ue值。如果在这个关联数组中已经有这个key了,就会更改这个key所对应的value。 2.取出关联数组中key所对应的value: $get=$ARRAY{key}; 取出在关联数组ARRAY中key所相对应的value,要先在关联数组名称前加上$这个
符号,而且key的名称要在{}符号之间,就会将key所对应的value取出来并指定给$get这个变量。 3.删除一对在关联数组中的数据: delete $ARRAY{key}; delete是Perl所提供的函数,作用是删除关联数组中的一个key以及这个key所对应的value。使用方法是在delete函数之后,再指定关联数
组中要删除key的名称。以下是有关关联数组用法的一些范例: %NAMES=〈I'"one",2'"two"); $one=$NAMES{1}; #此时$one等于"one" $two=$NAMES{2}; #此时$two等于"two" $NAMES{3}="third"; #增加一对key-value到关联数组NAMES中 #此时%NAMES=(1'"one",2'"two",3'"third"); $NAMES{3}="three"; #因为在关联数组中已经有3这个key了,所以就 #会把key为3所对应的value更改成"three" #此时%NAMES=(1'"one仰,2'"two",3'"three"); delete$NAMES{3}; #将关联数组中key值为3的一对key-value删除掉, #此时%NAMES=(1'"one",2'"two"), @X=%NAMES; #将关联数组NAMES指派给数组X #此时@X=(1'"one",2'"two"); %Y=@x; #将数组X指派给关联数组Y #此时%Y=(1'"one","two"); %NAMES=(); #此时%NAMES为一个空的关联数组
6.3.2 Perl在CGI程序设计中常用的函数
-------------------------------------------------------------------------------- 指令:# 说明:注解符号Remark宣告 范例:#本程序是一个示范注解说明
-------------------------------------------------------------------------------- 指令:print 语法一:print Filehandle LIST 说明:这个Filehandle可把它看作在I(Input)/O(Output)间的一个桥梁,可以利用Filehandle来做出数据读入写出的动作。stdin是代表从哪边输
入数据,例如从电脑的键盘输入,stdout是代表从哪边输出数据;例如从电脑的屏幕输出;stderr是代表从哪边输出错误的数据,例如从电脑的屏幕
输出。而在Perl语言中有三个标准的Filehandle: (一)STDIN(标准输入):是代表stdin的Filehandle (二)STDOUT(标准输出):是代表stdout的Filehandle (三)STDERR(标准错误输出):是代表stderr的Filehandle 如果要使用其他Filehandle的时候,就要用open这个函数来打开一个Filehandle,我们可以用print这个函数把LIST的数据输出给Filehandle
。在为大家介绍print这个 函数之前,先让我们来看看print函数中特殊打印符号字符: 符号 内定含意 \n 换行New Line \r 光标换行Return \t Tab键 \f 换页Form feed \b 退回一键Backspace \v 垂直Tab键 \a 响铃Bell \007 十进制ASCII码 \xff 十六进制码 \c[ 控制字符 范例: print STDOUT"i love perl\n"; 将“i love perl"再加上换行显示于屏幕上。 -------------------------------------------------------------------------------- 语法二:Print LIST 说明:如果省略Filehandle的话,就会把Filehandle内定为STDOUT。也就是会将LIST的数据内容显示于屏幕上。 范例: $Str1ng="perl"; print"i love $string\n"; 会将“i love perl”再加上换行显示在屏幕上,而如果要让双引号内的变量失效的话,可以在变量前面加上\这个符号。例如如果是print“
i love \$string”;的话,就会显示出“i love $string”这个字符串。 -------------------------------------------------------------------------------- 语法三:print 说明:同时省略Filehandle和LIST的话,就会以STDOUT为Filehandle,并会输出$_这 个内定输出变量的数据内容。如果$_变量是一个空字符串的
话,就会显示出一个空字符串。 范例: $_="i love perl\n"; print; 就会将"i love perl"再加上换行显示在屏幕上 -------------------------------------------------------------------------------- 指令:printf 语法一:printf Filehandle LIST 说明:在perl语言中也提供C语言中printf的语法,用法和C语言中的用法一模一样。如果把Filehandle省略的话,也一样会把STD0UT当成是内定的
Filehandle。在为大家介绍printf函数之前,先让我们来看看printf函数中变换符号的字符: 符号 内定含意 %c 字符 %s 字符串 %d 整数 %f 浮整数 %h 十六进制码 %o 八进制码 范例: printf〈"chmod%d%s\n","7l1","cgi"); 会将“chmod 7ll cgi”再加上换行显示于屏幕上。 -------------------------------------------------------------------------------- 指令:chop 语法:chop($string) 说明:把最后一个字符删除掉,常常用这个函数把换行的字符(\n)删除掉。 范例: $string="hello!\n"; chop($string); #此时$string="hello!"; 而这两行也可以写成chop($string="hello!\n"); -------------------------------------------------------------------------------- 指令:split 语法:split(/pattern/,$string,limit) 其中/pattern是文字处理的模式,在下一小节中会有详细的语法介绍。而limit是代表要分割的个数,可以省略。 说明:用一个指定的文字处理模式来分割$string字符串。 范例: $string="i;am;cute"; @list=split(/:/,$string); #此时@list=〈"i","am","cute"); ($a,$b,$c)=split(/:/,$string); #此时$a="i",$b="am",$c="cute"; @list=split(/:/,$string,2); #此时@list=("i","love"); 在传送CGI应用程序数据的时候会先将数据编码,其中会将FORM中每个数据字段的数据内容用&这个符号隔开,所以在解码的时候就要以&这个
符号为分割的字符,将每个数据字段分割出。例如: $string="who=A&email=B"; @list=split(/&/,$string), #此时@list=〈"who=A","email=B"); 而数据字段的名称和这个数据字段的值是用=这个符号来隔开,如果想取得数据字段的名称和所对应的值的话,就用要=这个符号来分割数据
字段,例如: $list="who=A"; (0$name,$value)=sp1it(/=/,$list); #此时$name="who";$value="A";
-------------------------------------------------------------------------------- 指令:keys 语法:keys(%ARRAY) 说明:取出关联数组%ARRAY中全部的key。 范例: %NAMES=(1,"one",2,"two"); @list=keys(%NAMES), #此时@list=(l,2);
-------------------------------------------------------------------------------- 指令:values 语法:values(%ARRAY) 说明:取出关联数组%ARRAY中全部的value。 范例: %NAMES=(1,"one",2,"two"); @list=values(%NAMES); #此时@list=("one","two");
-------------------------------------------------------------------------------- 指令:reverse 语法:reverse(@array) 说明:将数组@array中的元素由后到前重新排列。 范例: @list=("A","B","C","D"); @1ist=reverse(@list); #此时@list=("D","C","B","A")
-------------------------------------------------------------------------------- 指令:sort 语法:sort(@array) 说明:将数组@array中的元素由小到大排序,如果要由大到小排序的话,就要再加上reverse这个函数。 范例: @array=("b","c","a"); @array=sort(@array); #此时@array=("a",b","c"); @array=(reverse sort@array); #此时@array=("c","b","a"); 这个语法也可以写成@array=(reverse sort(@array)); @number=(l0,3.20); @number=sort(@number); #此时@number=(l0,20,3); 由上个范例可以知道如果要sort函数来排 序数值的时候,就会出差错,因此要用下面这个方法才能正确地使用sort函数来排序。 @number=(sort{$a<=>$b}@number); #此时@number=(3,10,20);
-------------------------------------------------------------------------------- 指令:length 语法:length($string) 说明:求出一字符串$string的bytes值。 范例: $string="Perl"; @size=length($string); #此时$size=4;
-------------------------------------------------------------------------------- 指令:substr 语法:substr($string,offset,length) 其中offset代表起始字符的位置,length代表引用的字符串长度,如省略length的话代表从起始值到字符串的最后一个字符长度。而offset
如果是负值的话,就会从字符串右边开始取出指定的字符串。 说明:在一字符串$string中取出想要的字符串。 范例: $x=substr("testing",2,2); #此时$x="st"; $x=substr("testing",2); #此时$x="sting"; $x=substr("testing",-2,2); #此时$x="in";
-------------------------------------------------------------------------------- 指令:index 语法:index($string,$substring,position) 其中$substring是指要寻找的字符,position代表要从哪一个位置开始找起,如省略position的话就从头开始找起。 说明:返回所要找寻的字符在一字符串$string中的位置,如果在字符串中找不到字符的话,则会返回-l这个值。 范例: $x=index("testing","t"); #此时$x=0; $x=index("testing","t",2); #此时$x=3; $x=index("testing","perl"); #此时$x=-l;
-------------------------------------------------------------------------------- 指令:push 语法:push(@array,$string) 说明:在数组@array的最后一个元素后附加新的元素string到数组@array中。 范例: @array=("one","two"); push(@array,"three"); #此时@array=〈"one","two","three");
-------------------------------------------------------------------------------- 指令:pop 语法:pop(@array) 说明:将数组@array的最后一个元素删除,并将删除的元素返回。 范例: @array=〈"one"'"two"); $rm=pop〈@array); #此时@array=("one");而$rm="two";
-------------------------------------------------------------------------------- 指令:unshift 语法:unshift(@array,$string) 说明:在数组@array的第一个元素前附加新的元素$string到数组@array中。 范例: @array=("one","two"); unshift(@array'"three"); #此时@array=("three","one","two");
-------------------------------------------------------------------------------- 指令:shift 语法:shift(@array) 说明:将数组@array的第一个元素删除,并将删除的元素返回。 范例: @array=("one","two"); $rm=shift(@array); #此时@array=("two"),而$rm="one";
-------------------------------------------------------------------------------- 、指令:join 语法:join($string,@array) 说明:在一数组@array的元素之间加上一指定的字符$string,并将结果返回。 范例: @array=("one","two","three"); $total=join(":",@array); #此时$total="one:two:three";
-------------------------------------------------------------------------------- 指令:grep 语法:grep(/pattern/,@array) 说明:将符合文字处理模式(regular expression)的数组元素找出来。 范例: @array=("one","on","in"); $count=grep(/on/,@array); #此时$count=2;(代表有二个元素符合) @result=grep(/on/,@array); #此时@result=("one","on");
-------------------------------------------------------------------------------- 指令:hex 语法:hex($string) 说明:将十六进制的数值转成十进制。 范例: $decimal=hex("ff"); #此时$decimal=255;
-------------------------------------------------------------------------------- 指令:rand 语法:rand($interger) 说明:常和函数srand搭配来取得一随机数,如果没有事先宣告stand函数的话,则取出的数值是一个固定值。这个语法会返回一个介于0和$interg
er之间的数值,如果$interger省略的话,则会返回一个介于0和1的数值。 范例: srand; #要先宣告srand函数,才能产生随机数的效果 $int=rand(10); #$int的值会大于0而且小于10 如果希望产生的乱数是整数的话,就要再 加上int这个函数 $int=int(rand(10)); #$int的值是一个整数,且值在0和9之间
-------------------------------------------------------------------------------- 指令:localtime 语法:localtime(time) 说明:可返回九个有关时间的元素,在写CGI应用程序的时候常会用到系统的时间,所以在此会详细介绍这个函数的用法。 范例: ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); 其中: $sec 代表秒数[0,59] $min 代表分数[0,59] $hour 代表小时数[0,23] $mday 代表是在这个月的第几天[1,31] $mon 代表月数[0,11],要将$mon加l之后,才能 符合实际情况 $year 从l990年算起的年数 $wday 从星期六算起,代表是在这周中的第几天 [0,6] $yday 从一月一日算起,代表是在这年中的第几 天[0,365] $isdst 只是一个flag 知道这些变量之后,就可以在CGI应用程序中拿来应用了。此外,也可以用下面这一行指令在Unix系统下取得系统的时间。为了避免错误发生,最
好用绝对路径的方法来取得系统时间,如果绝对路径不清楚的话可以用“which date”,这个指令来得知。最后要提醒读者的是要用`这个符号才
能执行Unix系统的外部程序,如果是用‘(单引号)这个字符号的话,就不能正确执行系统的程序了。
$date=`/usr/bin/date`; 而在perl5版本中,也可以用下面这一行指令来取得系统时间。 $date=localtime(time); -------------------------------------------------------------------------------- 指令:die 语法:die LIST 说明:会把LIST字符串显示出来,并退出程序。常常和$!这个代表错误信息的变量一起使用。 范例: Open(FILE'"$filename")||die"Cannotopenfile$!\n"; 如果打开文件失败的话,就会显示出错误的信息,之后再退出程序。 -------------------------------------------------------------------------------- 指令:open 语法:open(Filehandle'"$fiiename") 其中$filename是一个指定打开的文件名。 说明:这是一个很常用的函数,可用于文件的打开(Read0niy)。在CGI程序设计中常常会打开一个文件来读取数据,所以笔者会详加说明这一个函
数的相关用法。这个Filehandle可把它看作在I(Inpnt)/O(Output)间的一个桥梁,可以利用Filehandle来作出数据读入写出的动作。开始可用op
en这个函数来打开一个指定的文件,接下来可以使用<Filehandle>来读取所打开文件的数据内容,最后一定要用close这个函数来关闭这个之前打
开的Filehandle。要注意的是在CGI程序写作中,当用open这个函数来打开文件的时候,一定要在打开的文件前加上文件所在的绝对路径名称。 范例: $filename=Vpath/cgi.txt"; open(FILE'"$filename")||die"Can not open $filename\n"; #将数据指派给纯量变量$line(一行一行地) while($line=<FILE>){ print"$line"; } close(FILE); 就会把cgi.txt这个文件的内容显示出来。 -------------------------------------------------------------------------------- 语法二:open(Filehandle,"<$filename") 说明:这个语法也可以打开一个存在的文件(Read Only)。 范例: $filename="/path/cgi.txt"; open(FILE,"<$filename")||die"Can not open $filename\n"; #将<FILE>全部的数据内容都指派给数组@array @array=<FILE>; close(FILE); print"@array"; 也会把cgi.txt这个文件的内容显示出来。 -------------------------------------------------------------------------------- 语法三:open(Filehandle,">$filemme) 说明:建立一个新的文件(Write Only),如果已经存在这个文件了,就会把旧文件名覆盖过去。并可用print Filehandle的方式将数据写到所打开
的文件中。 范例: $filename="/path/cgi.txt"; open(FILE,">$filename")||die"Can not open $filename\n"; print FILE"this is a new line1\n"; #\n是换行字符 print FILE"this is a new line2\n"; close(FILE); 会把数据存在一个新文件中。 -------------------------------------------------------------------------------- 语法四:Open(Filehandle,">>$filename") 说明:数据用附加的方式写入一文件(Write Only),如果指定的文件名不存在的话,就会建立一个新的文件。 范例: $filename="/path/cgi.txt"; open(FILE,">>$filename")||die"Can not open $filename\n"; print FILE"this is a newline1\n"; print FILE"this is a newline2\n"; close(FILE); 会把数据附加(append)到一个文件(cgi.txt)中。 -------------------------------------------------------------------------------- 语法五:Open(Filehandle,"|Unix Command") 说明:就会把在Fiiehandle的数据输出给Unix的指令来作处理。 范例: $mailprog="/usr/ucb/mail"; #Unix系统上的寄信程序(要加绝对路径哦!) $who="jcjung@tem.nctu.edu.tw"; open(FILE,"|$mailprog$who")||die"CannotFail!\n"; print FILE"想不想我呀?\n"; print FILE"要快一点回信哦!\n"; close(FILE); 就会通过Unix系统mail的程序,将FILE这个Filehandle的数据内容寄给$who这个变量所指定的收信人。我们可以利用open这个函数来设计一
个来信批评指教的CGl应用程序,在本书中的下一章中会有详细的介绍。 -------------------------------------------------------------------------------- 指令:close 用法:close(Filehandle) 说明:用open这个函数来打开一个filehandle之后,一定要用close这个函数把所打开的Filehandle关闭。 范例: open(Fiiehandle,"$filename"); close(Filehandle); -------------------------------------------------------------------------------- 指令:pack 语法:pack("指定的格式",LIST) 说明:pack这个函数会将一个LIST变成所指定的二进制数据格式。在CGI程序分割解码过程中,会用到pack这个函数,所以笔者在此简单介绍这个
函数的用法。 范例: $string=pack("C",65); #此时$string="A"; 将65这个ASCII码转换成一个unsigned字符,其中C就是指定要转换成unsigned字符的意思。 -------------------------------------------------------------------------------- 指令:read 语法:read(Filehandle,$string,length) 其中length是代表读入字符串的长度(bytes)。 说明:用read这个函数把Filehand1e中的数据依指定的字符串长度读入之后指派给$string
这个变量。在CGI程序分割解码过程中,如果FORM的传送方式是设定为POST的话,就会将传送的数据设定为标准输入,所以会将数据内容指定给STD
IN这个标准输入的Filehandle,而CGI环境变量$ENV{'CONTENT_LENGTH'}就是代表使用者送出数据内容的长度,因此我们要用read这个函数来取得
使用者送出的数据内容。 范例: read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); 就会将STDIN这个标准输入Filehandle中的数据依指定的字符串长度读入,再指派给$buffer这个变量。 -------------------------------------------------------------------------------- 指令:exit 语法:exit 说明:退出执行的程序。 范例: print"i love perl"; exit; 显示出“i love perl"之后,就马上退出这个程序。 --------------------------------------------------------------------------------
6.3.3 Perl语言的运算符号字符
以下是在Perl语言中常用的运算字符,大部分和C语言中的运算字符很类似,学过C语言的人应该会对这些运算字符十分熟悉才对。
一、赋值(Assignment)运算符 符号 范例 说明 = $x=$y; 将$y的值指派给$x += $x+=$y; $x=$x+$y;将$x加$y之后再指派给$x -= $x-=$y; $x=$x-$y;将$x减$y之后再指派给$x *= $x*=$y; $x=$x*$y;将$x乘$y之后再指派给$x /= $x/=$y; $x=$x/$y;求出$x除以$y之后的商数,再指派给$x **= $x**=$y; $x=$x**$y;将$x乘上$y次方之后再指派给$x %= $x%=$y $x=$x%$y;求出$x除以$y的余数之后,再指派给$x .= $str1.=$str2; $str1=$str1.$str2; 将$str1这个字符串再加上$str2这个字符串之后,再指派给$str1这个字符串 x= $str x=$y $str=$str x $y 重复$str字符串$y次并把结果指派给$str这个字符串
二、算术(Arithmetic)运算符 符号 范例 说明 + $z=$x+$y 将$x和$y相加之后,再将结果指派给$z - $z=$x-$y 将$x减掉$y之后,再将结果指派给$z * $z=$x*$y 将$x和$y相乘之后,再将结果指派给$z / $z=$x/$y 将$x除以$y之后,再将商数指派给$z % $z=$x%$y 将$x除以$y之后,再将余数指派给$z ** $z=$x**$y 将$x乘以$y次方之后,再将结果指派给$z ++ $x++;++$x 如同$x=$x+1,将$x加一以后再将结果指派给$x -- $x--;--$x 如同$x=$x-1,将$x减一以后再将结果指派给$x . $z=$x.$y 将$x字符串和$y字符串连接之后,再将结果指派给$z
三、数值(Numeric Values)关系运算符 符号 范例 说明 > $x>$y 如果$x大于$y,返回1的值,否则返回0 >= $x>=$y 如果$x大于等于$y,返回1的值,否则返回0 < $x<$y 如果$x小于$y,返回l的值,否则返回0 <= $x<=$y 如果$x小于等于$y,返回1的值,否则返回0 == $x==$y 如果$x等于$y,返回l的值,否则返回0 != $x!=$y 如果$x不等于$y,返回1的值,否则返回0 <=> $x<=>$y 如果$x大于$y,返回1的值;如果$x等于$y,返回0;如果$x小于$y,则返回-1的值
四、字符串(StringValues)关系运算符 符号 范例 说明 gt $str1 gt $str2 如果$str1大于$str2,返回1的值,否则返回0 ge $str1 ge $str2 如果$str1大于等于$str2,返回1的值,否则返回0 lt $str1 lt $str2 如果$str1小于$str2,返回1的值,否则返回0 le $strl le $str2 如果$strl小于等于$str2,返回1的值,否则返回0 eq $strl eq $str2 如果$strl等于$str2,返回1的值,否则返回0 ne $str1 ne $str2 如果$strl不等于$str2,返回1的值,否则返回0 cmp $str1 cmp $str2 如果$str1大于$str2,返回1的值;如果$str1等于$str2,返回0;如果$str1小于$str2,则返回-1的值
五、逻辑(Logical)运算符 1.$x && $y(And) $x $y 结果 真(True) 真(True) 真(True) 真(True) 假(False) 假(False) 假(False) 真(True) 假(False) 假(False) 假(False) 假(False)
2.$x||$y(Or) $x $y 结果 真(True) 真(True) 真(True) 真(True) 假(False) 真(True) 假(False) 真(True) 真(True) 假(False) 假(False) 假(False)
3.!$x(Not) $x 结果 真(True) 假(False) 假(False) 真(True)
六、其他常用的运算符 -------------------------------------------------------------------------------- 指令:..区块运算符(Range Operator) 说明:这个运算符是Perl语言中特有的运算符,是一个很实用的运算符。 范例: @digits=(1..9); #此时@digits=(l,2,3,4,5,6,7,8,9); @digits=('10'..'05'); #此时@digits=(01,02,03,04,05); @char=('A'..'E'); #此时@char=('A','B','C','D','E'); @total=(l..3,'A'..'B');#此时@total=(1,2,3,'A','B'); -------------------------------------------------------------------------------- 指令:判别运算式?运算式1:运算式2 条件运算符(Conditional Operator) 说明:这个语法的意义和C语言一样,如果判别运算式的值是真(True)的话,则做运算1的 运算,如果判别运算式是假(False)的话,则做运算式2的
运算。 范例: $price=($age>60)?100:200; 如果$age大于60的话,则$price等于100;否则$price等于200. --------------------------------------------------------------------------------
七、常用的文件数据(File test)运算符 范例 说明 -r $file 如果$file是可读取的话,返回1的值 -w $file 如果$file是可写入的话,返回1的值 -x $file 如果$file是可执行的话,返回1的值 -e $file 如果$file存在的话,返回1的值 -o $file 如果$file是被执行者所拥有的话,返回1的值 -s $file 返回$file的文件大小(bytes) -f $file 如果$file是正常文件的话,返回1的 值 -T $file 如果$file是文本文件的话,返回1的值 -B $file 如果$file是Billry文件的话,返回1的值 -M $file 返回$file文件最后一次更改时间到现在的日期数
6.3.4 Perl语言的流程控制 以下是在Perl语言中常用的程序流程控制,大部分和C语言的程序流程控制很类似,学 过C语言的人,应该会很熟悉。
一、选择性流程控制 -------------------------------------------------------------------------------- 指令:if假如 语法一:if(判别运算式){ 程序叙述区块; } 上个语法在Perl中也可以写成: 程序叙述区块if(判别运算式); 范例: print"请输入您的分数?\n"; $score=<STDIN>; #<STDIN>代表标准输入,会让使用者输入一字符串 chop($score); #将$score最后一个换行字符\n删除掉 if($score>=60){ print"您的分数及格了!\n"; 也可以写成: print"您的分数及格了!\n"if($score>=60); -------------------------------------------------------------------------------- 语法二:if(判别运算式一){ 程序叙述区块一; }else{ 程序叙述区块二; } 范例: print"请输入您的分数?\n"; $score=<STDIN>; chop($score); if($score>=60){ print"您的分数及格了!\n" }else{ print"您的分数不及格!\n"; } -------------------------------------------------------------------------------- 语法三:if(判别运算式一){ 程序叙述区块一; }elsif(判别运算式二){ 程序叙述区块二; }else{ 程序叙述区块三; } 范例: print"请输入您的分数?\n"; $score=<STDIN>; chop($score); if($score>60){ print"您的分数大于60分!\n"; }elsif($score$
|