PERLPERL基础教程精华版基础教程精华版主讲:吴茂英上海交通大学主要内容PERL简介PERL脚本的编写PERL变量Perl语法PERL与正则表达式PERL示例PERL释义Practical Extraction and Report Language 实用摘录和报告语言,但它其实不是缩写Larry Wall,1987.12.18Perl的历史Perl的环境准备zUnix:大多数内置z一些软件也内置perl,比如apache/oraclezWindows:ActivePerl5.10.0Perl的工具编辑工具:notepad,viIDE:Komodo,Perl Dev KitCGI:Top perlstudio,Perl builder,perledit,perlwiz,Mod_perlPerl的功能z脚本语言,解释执行,无需编译z具有编译语言如c、Java的功能,又有shell脚本的方便z无数据类型区分,适于不太复杂的程序z适于不要求速度,不在乎内存CPU等系统资源的任务z强大的字符串处理功能z灵活或复杂的正则表达式z大多数平台支持,除了专用模块,可在不同平台运行Perl的应用Web编程:CGI,XML处理系统管理网络编程(安全脚本).数据库管理图像处理其他众多的领域。。。一个示例#!/usr/bin/perlPrint “This is my first perl program\n”;$a=;Print $a;z第一行:#!/usr/bin/perl 由什么程序执行以下的内容z注释:#z输入:z输出:printz$a:变量,无需指定数据类型perl的四种变量Scalar:标量,以$开始,后面以字母或_开头,再后面可以是字母或数字array:数组,列表,以@开头Hash:哈希,散列,以%开头文件:大写字母区分大小写,$Var, $VAR, $var内置变量$/,$@等字符串变量由双引号或单引号标识的一组字符组成。昀少0个字符(“”为空串),昀多可以占满内存,末尾不含null(‘\0’)“${str}ing”= $str+ “ing”!= $string记住一些常用的转义字符print “the \$varis $var.”注意单引号的用法:不替换、不转义$var=“str”;print“thisis$var”;#”thisisstr”print‘thisis$var’;#‘thisis$var’变量初值z未创建时状态为undef,到达文件尾也为undefz说明变量为未定义:undef $a;z用在条件判断中:if(undef $a)z代替不关心的变量:$s=“a:b:c:d;($a1,undef,undef,$d1)=split(/:/,$s);z如果有undef变量又不知在哪,可加‐w参数进行提示#!/usr/bin/perl ‐wz创建后状态为defined 一般用在条件判断中if(defined $a)z整数初值为0,字符串初值为空串””。一般未赋值就使用时$result = $undefined + 2; 相关函数length():字符串长度uc, lc, ucfirst, lcfirst:改变大小写函数substr, index, pos:字符串函数sin等三角函数rand(), srand():随机发生函数$lastchar= chop($str) # 截去昀后一个字符$result = chomp($str) # 截去末尾的行分隔符(通常为”\n”),行分隔符由$/定义控制结构if(condition1){}elsif(condition2){}else{}unless(){}until(){}do{} until()while(){}do {} while ()for(;;){}foreach循环语句foreach语法:foreach$w(list|array){statement}()内可以是数组@a,也可以是列表(1,2,3)数组元素值可以修改,列表则是常量$w不影响本来已定义的变量$w,循环结束后恢复可以用$a(@a)用相同的变量名称示例:foreach$a(@a){}用于数组foreach$a(1,2,3,4){}用于列表foreach$k(keys%h){}用于哈希/散列foreach$a(@a[1,2,4]){}仅对数组部分元素foreach(@a){}缺省循环变量为$_循环控制last:退出循环next:进入下一循环redo:重新执行本次循环goto:跳转continue{statement}单行条件语句与循环语句print $a if $a==0;print $a unless($a==0);print $a while ($a‐‐=0);print $a until ($a‐‐==0)•用||,&&的条件语句:$a==0&&print $a;open(F,’file’)||die “can’t open”;•die函数:在控制台标准错误输出信息后退出程序。•warn:输出信息后不退出程序,只起警报作用。•$!:内部变量,包含错误代码。•$@:内部变量,包含错误信息。列表——数组的形式形式:(1,”a”,2.3, $a, $x+1),其元素可以是数字、字符串、变量、表达式空列表(),单元素列表(2)不同于标量2qw(1 $a str)()可以用其他符号表示,如元素可以是数值、变量、不带引号的字符串,中间用空格分开范围表示的列表..:范围运算符,每次增加1,如1..3(1..6)=(1,2,3,4,5,6)(1,2..5,6)=(1,2,3,4,5,6)(3..3)=(3)(2.4..5.3)=(2.4,3.4,4.4)(4.5..1.6)=()(“aa”..”ad”)=(“aa”,”ab”,”ac”,”ad”)$month=(’01’..’31’)($a,$a+3)=(3,4,5,6) if $a=3数组——列表的存储@a=(1,2,3),不同于$a,初始值为()元素形式:$a[0]表示第一个元素,索引从0开始,$a[‐1]表示倒数第一个元素数组的赋值:@a=(1,2,3,4); @b=@a;@b=(2,3); @a=(1,@a,4);@a=; #从屏幕输入进行赋值,按下CTRL‐d结束改变元素的值:$a[1]=3;超出数组大小的元素赋值:$a[5]=6; #自动增长,其他元素为NULL读取不存在的元素为空:$b = $a[6];数组的读出@a=(1,2,3);$a=$a[1];($x, $y, $z)=@a; Æ$x=1, $y=2, $z=3;($x, $y)=@a; Æ$x=1, $y=2;($a,$b,$c,$d)=@a; Æ$a=1, $b=2, $c=3, $d=“”;$a=@a=$#a+1; # $a为数组长度,$#a为数组的昀后一个元素的索引($a)=@a; # 数组的第一个元素$a[0]打印数组:print @a; # 元素直接相连print “@a”; # 元素之间用空格分开数组片段@a=(1..5)@sub=@a[0,1,3];@a[1,3]=(“a”,”b”);@b=(1,2,3); @sub=@a[@b];@a[1,2]=@a[2,1];@a[1,2,3]=@a[3,2,4];数组操作函数sort:缺省按字母排序$a, $b表示数组元素,@_代表数组本身reverse @a; # 取数组的逆序chop @a; # 每个元素截去昀后一个字符shift(@a); # 删除数组第一个元素并返回该值,缺省对@ARGV数组unshift(@a); # 在数组头部添加元素,返回新数组长度push(@a,$a); # 在数组末尾添加元素pop(@a); # 删除数组末尾元素数组操作函数(二)join(连接符号, @a)把数组连接为一个字串@a=(‘a’,’b’); join(‘:’, @a)=“a:b”;split(/分隔符/, 分割串, 长度)分隔符:缺省为空格,可省略分割串:缺省为$_,可省略长度:可省略,缺省为全部分割$s=“a,b,c”; @a=split(/,/,$s); Æ@a=(‘a’,’b’,’c’);@a=split(/,/,$s, 2); Æ@a=(‘a’,’b’,’c’);数组函数(三)splice函数:@ret = splice(@a, skip, length, @newlist);z对数组@a进行操作,跳过skip个元素,然后用@newlist替换length个元素z@newlist长度可以不为length,但其替换长度总为lengthz如果length=0表示为插入;如果@newlist=()则表示为删除z当length和@newlist都省略时表示全部删除@found=grep(/pattern/, @search)对数组@search的每个元素进行搜索匹配pattern,匹配元素返回到@foundmap(expr, @list)对数组@list的每个元素进行expr运算,返回运算后的数组。元素用$_替代,如map($_+1, (1,2))Æ(2,3)二维数组@aoa=[[1,2,3],[‘a’,’b’,’c’]];该数组的元素为两个数组子数组访问:@{$aoa‐[0]}Æ(1,2,3)子数组元素列表:@{$aoa‐[0]}[0,1,2]子数组元素访问:$aoa‐[0][0]@a=(1,2,3);@b=(‘a’,‘b’,‘c’);$aoa=[[@a],[@b]];$aoa‐[0][0];关联数组:哈希/散列关联数组的表示:%h=(1,’a’,2,’b’);关联数组的下标为关键字key,由key得到的值为value上式的意义是%h=(1=‘a’,2=’b’);元素形式$h{1}=‘a’关联数组的赋值¾%a=(“key1”,1,”key2”,2);¾%h=@a;¾@a=%h;¾%h1=%h2;¾($a,%h)=@array;¾%h=(%first, %second);¾%h1=(%h2, ‘k’, ‘v’)¾函数的返回:%h=split();¾@keys=(‘a’,’b’,’c’); @hash{@keys}=@hash{reverse@keys};关联数组操作函数keys(%hash), values(%hash)分别返回键和值的列表,返回元素无顺序($key, $value)=each(%hash)效率高于先用foreach$k (keys %h), 再用$hash{$k}exists $hash{‘key’}判断关键字是否存在undef(%h)相当于删除散列%h=();delete关联数组的顺序foreach$w(sortkeys(%hash)) # 按照字符串排序或者foreach$w(sort{$a=$b} keys(%hash)) #数值排序文件存放于磁盘,用于读写访问,访问前必须先打开文件,结束时关闭文件open(HANDLE, “filename”) || die $!;成功返回非零,失败返回零HANDLE:文件句柄,用来代表操作的文件。以字母开头,字母、数字、下划线组成,一般用大写字母缺省打开的句柄STDIN, STDOUT, STDERR, 文件描述符为0,1,2。不必调用open就可以直接访问STDIN:键盘输入,控制台。STDOUT:屏幕,显示屏。STDERR:错误输出,显示屏。文件访问模式只读:open(F, “filename”);或者open(F, “filename”); 文件不存在则打开失败只写:open(F, “filename”); 文件不存在则创建新文件,存在则清空重写追加:open(F, “