PERL CGI简介及指令示范


摘自蔡奇玉、连振汉、张志强著《CGI编程指南》第六章
为尊重作者版权,只作部分节选,以作推介之用,
推荐您购买原书阅读!


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章中介绍如何在Windows95、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所对应的value值。如果在这个关联数组中已经有这个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和$interger之间的数值,如果$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来作出数据读入写出的动作。开始可用open这个函数来打开一个指定的文件,接下来可以使用<>来读取所打开文件的数据内容,最后一定要用close这个函数来关闭这个之前打开的Filehandle。要注意的是在CGI程序写作中,当用open这个函数来打开文件的时候,一定要在打开的文件前加上文件所在的绝对路径名称。
范例:
  $filename=Vpath/cgi.txt";
  open(FILE'"$filename")||die"Can not open $filename\n";
  #将数据指派给纯量变量$line(一行一行地)
  while($line=<>){
   print"$line";
  }
  close(FILE);
  就会把cgi.txt这个文件的内容显示出来。


语法二:open(Filehandle,"<$filename")
说明:这个语法也可以打开一个存在的文件(Read Only)。
范例:
  $filename="/path/cgi.txt";
  open(FILE,"<$filename")||die"Can not open $filename\n";
  #将<>全部的数据内容都指派给数组@array
  @array=<>;
  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的话,就会将传送的数据设定为标准输入,所以会将数据内容指定给STDIN这个标准输入的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=<>; #<>代表标准输入,会让使用者输入一字符串
  chop($score);  #将$score最后一个换行字符\n删除掉
  if($score>=60){
    print"您的分数及格了!\n";
  也可以写成:
  print"您的分数及格了!\n"if($score>=60);


语法二:if(判别运算式一){
     程序叙述区块一;
    }else{
     程序叙述区块二;
    }
范例:
  print"请输入您的分数?\n";
  $score=<>;
  chop($score);
  if($score>=60){
    print"您的分数及格了!\n"
  }else{
    print"您的分数不及格!\n";
  }


语法三:if(判别运算式一){
      程序叙述区块一;
    }elsif(判别运算式二){
      程序叙述区块二;
    }else{
      程序叙述区块三;
  }
范例:
  print"请输入您的分数?\n";
  $score=<>;
  chop($score);
  if($score>60){
    print"您的分数大于60分!\n";
  }elsif($score$x?){
    print"您的分数小于60分!\n";
  }else{
    print"您的分数刚好是60分!\n";
  }


指令:unless假如非
语法一:unless(判别运算式){
       程序叙述区块;
    }
   上个语法在Per1中也可以写成:
   程序叙述区块unless(判别运算式);

范例:
  print"请输入您的分数?\n";
  $score=<>;#<>代表标准输入,会让使用者输入一字符串
  chop($score);#将$score最后一个换行字符\n删除掉
  unless($score<60){
    print"您的分数及格了!\n";
  }
  也可以写成:
  print"您的分数及格了!\n"unless($score$x?);


语法二:unless(判别运算式一){
      程序叙述区块一;
    }else{
      程序叙述区块二;
    }
范例:
  print"请输入您的分数?\n";
  $score=<>;
  chop($score)
  unless($score$x?){
    print"您的分数及格了!\n";
  }else{
    print"您的分数不及格!\n";
  }


  二、循环流程控制


指令:while当..
语法:while(判别运算式){
     程序叙述区块;
   }
  上个语法在Perl中也可以写成:
  程序叙述区块while(判别运算式);
范例一:
  while($i<=10){
    $sum+=$i;
    $i++;
  }
  print"$sum\n";  #此时$sum=55;
范例二:
  $filename="/path/cgi.txt";
  open(FILE,"$filename")||die"Can not open $filename\n";
  #可以把<>视为在打开文件中某一行的数据
  while($line=<>){
    print"$line";
  }
  close(FILE);
  就会把cgi.txt这个文件的内容显示出来。而这个范例可以把它改写成:
  $filename="/path/cgi.txt";
  open(FILE'"$filename")||die"Can not open $filename\n";
  print"$line"while($line=<>);
  close(FILE);
  在这个范例中是把$filemme文件内的数据一行一行指派给$line这个纯量变量,再 把$line显示出来。如果没有将<>指派给一个纯量变量的话,则会有一内定的 输入变量$_被<>所指派。因为$_是一个内定的变量,所以如果使用print函数 的时候没有加上要输出数据的话,就会把$_的数据print出来。所以这个范例也可 以改写成:
  $filename="/path/cgi.txt";
  open(FILE,"$filename")||die"Can not open $filename\n";
  while(){
    Print;
  }
  close(FILE);


指令:do while 当..
语法:do{
    程序叙述区块,
   }while(判别运算式);
  在while和do while循环中最大的不同是在do while循环中,程序叙述区块至少会 被执行一次。
范例:
  do{
    $sum+=$i;
    $i++;
  }while($i<=10);
  print"$sum\n";    #此时$sum=55,


指令:until直到...才
语法:until(判别运算式){
     程序叙述区块;
  }
  上个语法在Perl中也可以写成:
  程序叙述区块 until (判别运算式);
范例:
  until($i>10){
    $sum+=$i;
    $i++;
  }
.   print"$sum\n";#此时$sum=55;


指令:do until 直到...才
语法:do{
    程序叙述区块;
   }until(判别运算式);
范例:
  do{
    $sum+=$i;
    $i++;
  }until($i>l0);
;   print"$sum\n";#此时$sum=55;


指令:for循环陈述
语法一:for(初始化运算式,判别运算式;循环过程运算式){
      程序叙述区块;
     }
范例一:
  $sum=0;
  for($i=l;$i<$i++){
    $sum+=$i;
  print"$sum\n";    #此时$sum=55;
范例二:
  @array=(3,6,9);
  $number=@array:   #把数组@array的元素个数指派给$number
             #此时$number=3;
  for($i=0;$i<$i++){
    $sum+=$array[$i]:#把数组@array元素的值全部加起来
  }
语法二:for$variab1e(@array){
    程序叙述区块;
    }
  在Perl语言中的for循环陈述还可以使用这个语法,和循环陈述foreach的用法一 样。如果把$variable变量省略的话,就会将数组@array 的元素一个一个指定给 $_这个变量,这是比较精简的写法。
范例:
  @array=(3,6,9);
  for$int(@array){
    $sum+=$int;
  }
  print"$sum\n";#此时$sum=18;
  也可以写成:
  @array=(3,6,9);
  for(@array){
    $sum+=$_;
  }
  print"$sum\n";#此时$sum=18;


指令:foreach 循环陈述
语法:foreach $variable(@array)(
   程式叙述区块;
   }
  如果把$variable变量省略的话,就会将数组@array的元素一一指定给$_这个内定 的输出变量。
范例一:
  @array=(3,6,9);
  foreach $int(@array){
    $sum+=$int;
  Print"$sum\n";#此时$sum=l8;
  也可以写成:
  @array=(3,6,9);
  foreach(@array){
    $sum+=$_;
  }
  print"$sum\n";#此时$sum=18;
范例二:
  %F0RM=("name"'"NCTU","value","TEM");
  foreach $pair(sort keys%FORM){     print"$pair is $FORM{$pair}\n";
  }
  这个范例在CGI程序写作中常常会用到。先用keys这个函数来求出关联数组中全部 的key,再用sort这个函数把全部的key由小到大排序,最后再把关联数组中的key和 所对应的值(value)一一显示出。而以上这个程序也可写成:
  %FORM=("name"'"NCTU","vaiue","TEM");
  @array=(sortkeys%F0RM);
  foreach $pair(@array){
    print"$pairis$F0RM{$pair}\n";
  }


指令:last 退出循环陈述
语法:last
范例:
  for($i=1;$i<=l0;$i++){
    last if ($i==5); #如果$i等于5的话就退出for循环
    print"$i\n";
  }
  会把l到4之间的数值显示出来。


指令:next到循环的下一个陈述
语法:next
范例:
  for($i=l;$i<=10;$i++){
    #如果是2的倍数的话,就到循环的下一个陈述
    next if (($i%2)==0)
    print"$i是一个奇数!\n";
  }
  会把1到10之间的奇数显示出来。


6.3.5 Perl语言的文字处理模式(Regular Expression)
  如果在Unix中曾经使用过sde、awk、grep这些指令的话,相信对于Perl语言中的文字处理模式(Regular Expression) 应该不会感到陌生才对。在Perl语言中因为有这个功能,所以对于字符串的处理能力是非常强有力的。Regular Expression可视为用来处理字符串的一种模式(pattern),其使用的格式为/pattern/。在Perl语言的程序设计中,经常可以看得到类似语法的应用,在CGI程序设计中也不例外。只要能够善用文字处理模式的话,要处理任何难的字 符串皆可迎刃而解,在本章中笔者会用深入浅出的方式来介绍Regufar Expression的用法。

  一、文字处理(RegularExpression)的常用语法

  以下是文字处理模式中,/pattern/常用到的语法:

/pattern/ 说明
  除了换行字符/n外,找寻只有一个字符的字符串
x? 找寻0个或是1个x字符
x* 找寻0个或是0个以上的x字符
.* 找寻0个或是0个以上的任何字符
x+ 找寻1个或是1个以上的x字符
.+ 找寻1个或是1个以上的任何字符
{m} 找寻刚好是m各个数指定的字符
{m,n} 找寻在m个个数以上、n个个数以下指定的字符
{m,} 找寻m个个数以上指定的字符
[] 找寻符合[]内的字符
[^] 找寻不符合[]内的字符
[0-9] 找寻符合0到9的任何一个字符
[a-z] 找寻符合a到z的任何一个字符
[^0-9] 找寻不符合0到9的任何一个字符
[^a-z] 找寻不符合a到z的任何一个字符
^ 找寻字符串开头的字符
$ 找寻字符串结尾的字符
\d 找寻一个digit(数字)的字符,和[0-9]语法一样
\d+ 找寻一个digit(数字)以上的字符串,和[0-9]+语法一样
\D 找寻一个non-digit(非数字)的字符,和[^0-9]语法一样
\D+ 找寻一个non-digit(非数字)以上的字符串,和[^0-9]+语法一样
\w 找寻一个英文字母或是数值的字符,和[a-zA-Z0-9]语法一样
\w+ 找寻一个以上英文字母或是数值的字符串,和[a-zA-Z0-9]+语法一样
\W 找寻一个非英文字母或是数值的字符,和[^a-zA-Z0-9]语法一样
\W+ 找寻一个以上非英文字母或是数值的字符串,和[^a-zA-Z0-9]+语法一样
\s 找寻一个空白的字符,和[\n\t\r\f]一样
\s+ 找寻一个以上空白的字符,和[\n\t\r\f]+一样
\S 找寻一个非空白的字符,和[^\n\t\r\f]一样
\S+ 找寻一个以上非空白的字符,和[^\n\t\r\f]+一样
\b 找寻一个不以英文字母、数值为边界的字符串
\B 找寻一个以英文字母、数值为边界的字符串
a|b|c 找到符合a字符或是b字符或是c字符的字符串
abc 找到一个含有abc的字符串
(pattern) ()这个符号会记忆所找寻到的字符串,是一个很实用的语法
第一个()内所找到的字符串变成$1这个变量或是\1变量
第二个()内所找到的字符串变成$2这个变量或是\2变量
以此类推,笔者会在下一个小节中详细介绍它的用法
/pattern/i i这个参数是代表忽略英文大小谢的意思,也就是在找寻字符串的时候,不会去考虑英文的大小写
\ 如果要在pattern模式中找寻一个有特殊意义的字符,要在这个字符前加上\这个符号,这样才会让这个特殊字符失效


  二、文字处理模式(RegularExpression)的简单范例

  看了上一小节文字处理模式〈RegularExpression)之后,初学者对于这个语法的应用可能 还不是很清楚,所以笔者会在这一小节中,举出一些在文字处理模式中常用的范例给大家瞧瞧:

范 例 说  明
/perl/ 找到含有perl的字符串
/^perl/ 找到开头是perl的字符串
/perl$/ 找到结尾是perl的字符串
/c|g|i/ 找到含有c或g或i的字符串
/cg{2,4}i/ 找到c后面跟着2个到4个g,再跟着i的字符串
/cg{2}i/ 找到c后面跟着2个g,再跟着i的字符串
/cg*i/ 找到c后面跟着0个或多个g,再跟着i的字符串,如同/cg{0,}i/
/cg+i/ 找到c后面跟着一个以上的g,再跟着i的字符串,如同/cg{1,}i/
/cg?i/ 找到c后面跟着0个或是一个g,再跟着i的字符串,如同/cg{0,1}i/
/c.i/ 找到c后面跟着一个任意字符,再跟着i的字符串
/c..i/ 找到c后面跟着二个任意字符,再跟着i的字符串
/[cgi]/ 找到符合有这三个字符任意一个的字符串
/[^cgi]/ 找到没有有这三个字符任意一个的字符串
/\d/ 找寻符合数值的字符串
可以使用/\d+/来表示一个或是个多个数值的字符串
/\D/ 找寻符合不是数值的字符串
可以使用/\D+/来表示一个或是个多个非数值的字符串
/\w/ 找寻符合英文字母、数值的字符串
可以使用/\w+/来表示一个或是个多个英文字母、数值的字符串
/\W/ 找寻符合非英文字母、数值的字符串
可以使用/\W+/来表示一个或是个多个非英文字母、数值的字符串
/\s/ 找寻符合空白的字符串
可以使用/\s+/来表示一个或是更多个空白字符的字符串
/\S/ 找寻符合不是空白字符的字符串
可以使用/\S+/来表示一个或是更多不是空白的字符的字符串
/\*/ 找寻符合*这个符号的字符串,因为*在文字处理模式中有它的特殊意思,所以要在这个特殊符号前加上\这个符号,这样才会让这个特殊字符失效
/abc/i 找寻符合abc的字符串而且不考虑这些符合字符串的大小写


  三、文字处理模式(Regular Expression)相关的运算符及函数

  在perl程序写作中常会用到=~和!~这两个运算符及s和tr这二个函数来和文字处理 模式/pattern/搭配而成一个运算式,如果能够活用这些指令的话,就可以很轻易地来处 理一些字符串,当然在CGI程序设计中也就更能得心应手了。现在就让作者来介绍这些 运算符及函数的用法:


指令: /pattern/文字运算
说明:如果在文字运算中没有使用=~或是!~运算符指定一个字符串来做运算的话, 就会 使用内定的输出变量$_来做/pattern/文字运算。
范例一:
  $string="chmod7llcgi";
  $string=~/(\w+)\s+(\d+)/;
  第一个(\w+)是代表找寻数个字母,并将所找到的字符串指派给$l这个变量,而\s+代表 找寻多个空白的字符串,最后(\d+)代表找寻数个数值,并将所找到的字符串指派给$2这 个变量。所以$l="chmod",$2=71l,但是$string还是等于原来的字符串,没有改变。
范例二:
  $_="chmod71lcgi";
  /(\w+)\s+(\d+)/;
  因为是把字符串指定给$_这个变量,所以可以不用=~这个运算符就会得到$l="chmod", $2=711;而且$_还是等于原来的字符串,没有改变。
范例三:
  $string="chmod71lcgi";
  @list=split(/\s+/,$string);
  以一个或是多个空白字符来分割$string这个字符串,这是一个很常用的语法。此时
  @list=("chmod","7ll","cgi");


指令: =~相配运算符
说明:这是Perl语言中特有的语法,通常会和文字处理模式来作运算。
范例:
  print"请输入一个字符串!\n";
  $string=<>; #<>代表标准输入,会让使用者输入一字符串
  chop($string);  #将$string最后一个换行的字符\n删除掉
  if($string=~/cgi/){
    print"输入的字符串中有cgi这个字符串!\n";
  }
  如果输入的字符串中含有cgi这个字符串的话,就会显示出这个信息。


指令:!~不相配运算符
说明:这也是Perl语言中特有的语法,通常会和文字处理模式来作运算。
范例:
  print"请输入一个字符串!\n";
  $string=<>; #<>代表标准输入,会让使用者输入一字符串
  chop($string);  #将$stdng最后一个换行的字符\n删除掉
  if($string!~/cgi/){
    print"输入的字符串中没有cgi这个字符串!\n";
  }
  如果输入的字符串中没有含有cgi这个字符串的话,就会显示出这个信息。


指令:tr转换函数
语法:tr/SEARCHLIST/REPLACELIST/
  其中SEARCHLIST是要转换的字符,REPLACELIST是转换成何种字符。
说明:tr(translate)就是转换的意思,会把符合转换的字符转换成要转换的字符。
范例一:
  $string="test1ng";
  $string=~tr/et/ET/;#此时$string="TEsTing";
  $string=~tr/a-z/A-Z/;#此时$string="TESTING";
范例二:
  $string="CGI+Perl";
  $string=~tr/+//;#此时$string="CGI Perl";
  在传送CGI数据的时候会先将数据编码,其中会将空白的字符转成+这个字符,所以 在解码的时候要把+这个字符还原成空白的字符。


指令:s取代函数
语法:s/PATTERN/REPLACE/eg
  其中PATTERN是文字处理(Regular Expression)的模式,REPLACE是代表取代成何种文字 模式。而g是这个函数最常用的参数,代表要把所有符合文字模式的字符串 全部取代,如果省略这个参数的话,则只取代一个符合文字模式的字符串;而加上e这 个参数是代表要将REPLACE的部分当成一个运算式,如果没有这个需要的话,就不用加 上这个参数了。
说明:将符合文字处理模式的字符串取代成为要取代的字符串。
范例一:
  $string="i;love;perl";
  $string=~s/:/*/:   #此时$string="i*love:perl";
  $string=~s/:/*/g;   #此时$string="i*love*perl";
  $stiing=~s/*/+/g;   #此时$string="i+love+perl";
  $string=~s/+//g:   #此时$string="i love perl";
  上一行也可写成$string=~tr/+//;效果都会一样哦!
  $string=~s/per1/cgi/; #此时$string="i love cgi";
范例二:
  $string="i love per";
  $string=~s/(love)/<$1>/;
  第一个()内所找到的字符串变成$1,在这个范例中,会把变量love这个字符串变成 <>,此时$string="i<>perl";

  $string="i love per1";
  $string=~s/(i)(perl)/<$1><$2>/;
  在这个范例中,会把i变成<>,perl变成<>此时$string="<>love<>";

  $striag="i love per1";
  $string=~s/(\w+)/<$1>/g;
  (\w+)代表找寻符合一个或是多个英文字符或是数值的字符串,之后再将找到的字 符串设成$l。因为加上g这个参数,所以会找到字符串中的这三个英文单字, 然后 再把这三个单字分别加上<>这个符号,此时$string="<><><>";
范例三:
  $string="ww22cgi44";
  $string=~s/(\d+)/$1*2/e;
  (\d+)代表要找寻$string中一个或是多个数值的字符串,再将找到的字符串设成 $1。加上参数e是代表要把$l*2当作是一个运算式,所以$string="www44cgi44";
  $string="www22cgi44";
  $string=~s/(\d+)/$1*2/eg;
  加上参数e,所以会把$1*2当作是一个运算式来看, 加上参数g就会把全部符合数 值的字符串经过运算式运算之后再把它取代,所以$string="www44cgi88";
范例四:
  假设原本的字符串是$value="三八!",经CGI数据编码之后,这个字符串就会变成 $value="%A4T%A4K%21"。以下是一个解码的示范程序:
  $value="%A4T%A4K%2l";
  $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($l))/eg;
  在传送CGI数据的时候会把数据编码,其中会将特殊字符或是中文字符编码成以% 开头的连续两个十六进制数的字符串,所以要用s这个函数来找寻这个以%开头的 字符串。为了要把找到的字符串再做解码的处理, 所以要在%这个符号之后加上 ()这个符号, 表示会把找到的字符串记忆起来并指定给$1这个变量,而且要在() 中加上代表是连续两个十六进制数值的文字处理模式(Regular Expression),也 就是[a-fA-F0-9][a-fA-F0-9]。再用hex这个函数($1是代表符合的字符串)把十 六进制数值转成十进制的码,之后再用pack这个函数(以C为参数,是代表 unsigned char value的意思)把这个十进制码还原成原来的字符串。最后就会 把这个字符串解码成$value="三八!"。值得一提的是也可以把这个解码的程序 写成:

  $value=~s/%(..)/pack("C",hex($l))/eg;

  在此提供给读者参考。


6.4 Perl for Win32 简介

  Perl原本只能在Unix系统中使用,正因为功能强大,所以这几年就有人把它移植到各种 操作系统上。到目前为止,已经可以在Unix、Linux、FreeBSD、Windows95、WindowsNT、 dos、0S2、Macitosh等操作系统中使用Perl语言了。使用者可以在Windows32位的系统 如:Windows95、WindowsNT等操作系统中使用Perl语言来写CGI应用程序。
  在Windows95、WindowsNT这些32位的系统下使用Perl来写CGI应用程序之前,要先安装 一个叫Perl for Win32的软件。这个软件原本最先是在Windows NT系统下使用的,所以 也有人将这个软件称之为NT Perl。随着版本的改良以及Windows95操作系统的出现,现 在也可以在Windows95操作系统中使用Perl语言了,在本书第8章中将介绍如何在Windows95、 Windows NT系统中安装Perl主程序,并会在第8章中介绍这些系统的CGI程序写作实例。