perl语言学习 149页

  • 554.00 KB
  • 2022-08-11 发布

perl语言学习

  • 149页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
  4. 网站客服QQ:403074932
Perl语言学习\n软件是由语言写成的;语言分为高级语言,低级语言高级语言:专指脚本语言(也就是不对低层硬件进行信息交换,如:shell,awk等)低级语言:专指那些对低层硬件进行操作的语言(如,C,C++,Java等)如果需要拥有低层语言和高级语言的全部特殊,并且这个语言有很少的限制,让每个程序员随心所欲的写自己的程序(当然如果程序是写给自己看的,就随便怎么写,如果写给大家看的,那么还是要为看的人着想!)!这在20世纪80年代以前是无法实现的!只能想想罢了Perl语言\nPerl语言的产生20世纪80年代语言学家:larry为了从文件层产生报表,为此使用awk语言,但是没有结果,使用C写,根本无法想象要产生多大的代码:来完成一个小任务!作为一个比较懒惰的程序员,larry决定自己发明一个语言,让拥有:低级语言和高级语言的全部特性,因此---perl出生了Perl几乎不受限制,而且速度也非常的快,唯一的缺点就是有点丑陋;只是因为好学好用,不受限制,因此它很快就流行起来!Perl语言\nPerl发展Larry近年来不在自己亲自编写所有程序代码,而是交给perl团队进行维护及升级,他只是做出关键性的决策!更为重要的是:perl是开源软件(什么是开源软件呢?),我们每个人都可以得到perl的源代码,加以修改并发布,只是要遵守开源软件的规定!Perl4Perl5已经发布,是稳定版本Perl6还不是那么稳定相信在不远的将,你也可以成为一个perl专家,为开源软件出自己一份力:为中国的开源软件而奋斗Perl语言\nPerl的擅长Perl处理的整体来说:90%都是文字处理有关,10%可以用来处理其它事务Perl语言\n做为程序员1:应该学会操作unix或者linux2:学会使用vim或者emacs3:学习正则表达式4:熟悉计算机硬件5:学会引用及管理网络Perl语言\n标量数据1:指单件事物2:标量可以是数值,也可以是由字符组成的字符串3:数值与字符串是通用的4:perl内部一律使用“双精度浮点数”;也就是是说,perl内部不存在整数值程序中用到的整数常量会被转换成等效的浮点值5:每条语句以分号结束,建议每条语句单独占用一行6:注释以“#”开始,后面所有的字符都为注释Perl语言\n浮点数直接量(相当于常量)1:小数点前置的“+”“-”可有可无2:数值后面加上”e”表示幂,如:12e2---表示12*102Perl语言\n整数直接量(相当于常量)1:整数直接量也就是平时所写的数字,如:123456789(不过太简单了未必就是好事:人难读;再好的程序也给人读的)2:perl允许在整数直接时中加入下划线(_)来提高可读性,如:123_456_789Perl语言\n非十进制的整数直接量(相当于常量)1:二进制如:0b111011102:八进制如:03773:十六进制如:0xfff0fff0当然perl也是允许在非十进制量中加入下划线来提高程序的可读性,如:0xffff_1111_ffffPerl语言\n运算操作符1:+2:-3:*4:/5:%(只取整数部分操作)6:**(乘幂操作)Perl语言\n字符串1:字符串可以包含各种字符的任意组合2:最小的字符串就是空字符串,最大的字符串可以填满整个内存3:字符串也拥有“字符串直接量”也就是说可以写一些二进制的字符串让perl来操作,如:””00000111111111”Perl语言\n1:单引号内的字符串直接量指在单引号内包含的字符串直接量,它取消了所有元字符的特殊含义如\n:做元字符时,表示换行操作不做元字符时,就是普通的字符\n,代表它们本身注意:只有在“\”后面跟有“\”(反斜杠)或者“’”(单引号)时,反斜杠才能有特殊的含义Perl语言\n2:双引号内的字符串直接量指包含在一对双引号内的任意字符串直接量,有如下功能1>元字符拥有其特殊的含义2>在双引号内的可以进行变量替换(就是把输出变量原有的值)Perl语言\n双引号内字符串的反斜线转义字符\n换行\r回车\t水平制表\f换页\b退格\\反斜线\"双引号\l将下个字符转为小写\u将下个字符转为大写Perl语言\n字符串操作符1:字符串连接操作符,符号:“.”(点号),连接字符串必须明确的使用此操作符,如:字符串“du”和字符串“jian”连接它们时可以这样操作:“du”.“jian”---得到的输出就是:”dujian”2:复制操作符,符号:“x”(小写),请这样来操作:“du”x3---表示将字符串“du”复制三次,输出就是”dududu”;使用时必须注意,右边的数字必须是整数Perl语言\n数字与字符串之间自动转换通常情况下,perl会在字符串与数字之间自动进行转换,那么perl是如何知道何时需要字符串,何时需要数字的呢?回答的关键在于:作用于标量的操作符来决定如果操作是算术运算操作符,那么标量是数字形式如果操作符是字符串操作符,那么标量便是字符串形式Perl语言\n标量变量1:标量变量命名---以$开头,后面包含:字符,数字,下划线,且以字符或者下划线占据第二个位置;如:$name2:perl语言是区分大小写的语言3:标量的名称尽量取用一些有实际意义的名称Perl语言\n标量变量赋值1:perl以等号作为赋值符号(=)2:等号的左边是变量,右边的表达式就是值如:$name_1=“du”;$name_2=“jian”;$name_3=“sheng”;$name=“$name_1”.“$name_2”.“$name_3”;最后的这个语句在perl是合法的,而且还是非常的常见3:对于未赋值的变量,perl会自动赋值为空字符串Perl语言\n复合操作符+=,-=,*=,/=,%=,.=(连接字符串)<<=,>>=,|=,^=,&=Perl语言\n复合操作符+=,-=,*=,/=,%=.=(连接字符串)<<=,>>=,|=,^=,&=Perl语言\n复合操作符+=,-=,*=,/=,%=.=(连接字符串)<<=,>>=,|=,^=,&=Perl语言\n输出操作print作用:它可以把标量直接输出到标准输出注意区别:如$name=“sheng”--print$name;============sheng--print“$name”;========sheng--print“dujian$name”;=dujiansheng--print“dujian”$name;=dujiansheng由此可见,当只含有标量变量时,可以不加双引号;当含有字符串直接量和标量变量时,应该加双引号Perl语言\n输出操作print作用:它可以把标量直接输出到标准输出注意区别:如$name=“sheng”--print$name;============sheng--print“$name”;========sheng--print“dujian$name”;=dujiansheng--print“dujian”$name;=dujiansheng由此可见,当只含有标量变量时,可以不加双引号;当含有字符串直接量和标量变量时,应该加双引号Perl语言\n操作符的优先级1:算术去处符的优先级高于移位运算符2:关系运算符的优先级高于逻辑运算符Perl语言\n操作符的结合性1:复合运算符的结合性是---右2:其余的基本上是左结合性Perl语言\n关系操作符(数值型)==!=<>>=<=Perl语言\n关系操作符(字符型)相等eq不相等ne小于lt大于gt大于等于ge小于等于le关系去处符的返回一律是:真假Perl语言\n逻辑运算符Perl语言\n布尔值1:perl没有独立的布尔数据类型2:依靠以下规则进行判断1>数字情况下:0为假,其余为真2>字符串情况下:空字符串为假(空字符串表示:“”),非空为真3>如果不是数字或者字符串,先转换成数字或者字符串,再进行比较特别注意:字符串“0”或者‘0’为假,perl把这个字符当成0对待Perl语言\n控制结构(if判断结构)语法形式If(condition){Statements1;}else{Statements2;}说明:当条件成立时,就执行语句1,否则执行语句2Perl语言\n循环控制(while)语法:while(表达式){语句一;语句二;}其中红色部分表示其是程序规定的部分,不可缺少Perl语言\n循环控制(unless)Perl语言\n循环控制(until)Perl语言\n取得用户输入1:输入操作符:接受从进行标准输入如:$line=;特别注意:所接受的输入的后面包含:一个换行符Perl语言\n函数chomp1:只能用在变量上,并且该变量的内容提要必须为字符串2:去掉字符串结尾的换行符(前提是有换行符);如果结尾没有换行符,chomp不会起作用并且只返回03:只能去掉一个换行符如:$name=;Chomp($name);更简便的写法:Chomp($name=);Perl语言\nUnder值程序中用到了一个常量,却没有对这个变量进行初始化或者赋值,会出现什么样的后果呢?可能在其它语言中,后果不能想象,但是在perl中,这没有什么大不了;因为perl在使用的时候已经把其当成“空无一物”来对待了1:如果当成一个数字使用,那么其就是02:如果当成字符串使用,那么其便是空字符串Perl语言\n函数defined(还没有明白)通常情况下在输入结束的时候,会返回一行文字;但是若是输入结束了像遇到“文件结尾”符号,它就会返回undef来表示这个状态要判断某个字符串是undef而不是空字符串,就可以使用函数:defined;这个函数会对undef返回假,对其它函数返回真Perl语言\n列表和数组1:标量是单数2:列表和数组是复数列表:指的是标题的有序集合---数据数组:指的是存储列表的变量---变量Perl语言\n列表,数组的共性列表,数组中的每个元素都是单独的标量变量,拥有独立的标量值,这些值是依次排列,也就是说从第一个到最后一个的顺序都是固定不变的,列表,数组中元素的索引是从0开始;其元素的值可以包含:数字,字符串,undef值或者不同类型的标量值的混合;不过还是让所有的元素拥有相同的类型列表,数组可以拥有任意多个元素(最少时一个也没有,最多时可以填满计算机内存),perl遵循了:去除不必要的限制Perl语言\n列表直接量构成:列表直接量就是用圆括号括起来的一串以逗分隔的值,如(“du”,”jian”,”sheng”)特别注意:单词必须加引号(1..5)请注意此列表常量“..”表示范围,由1每次加1,直到等于5为止列表的直接量的元素也可以为“表达式”($name,1,”du”)简写方法:qw的意思是:quotedword命令:qw/dujiansheng/,其中//是分隔符Perl规定:任何的标点都可以不分隔符Perl语言\n列表变量($name1,$name2,$name3)请这样给列表变量赋值1:($name1,$name2,$name3)=(“du”,“jian”,“sheng”)2:($name1,$name2,$name3)=qw/dujiansheng/注意事项:1:变量数目多于列表元素数目---多余的变量被赋值undef2:列表元素数目多于变量数目---忽略掉多余的列表元素Perl语言\n列表定界符qw/.../1:perl规定可以使用任何标点符号作为定界符2:起始处的定界符和结尾处的界定符必须相同(也就是成对使用)Perl语言\n其它注意事项1:列表使用的是圆括号即:()2:列表赋值的时候,建议将列表放在圆括号中即:()Perl语言\n数组通常情况是存储同种类型的数值(并不一定都是同种类型),以下标对每个元素进行引用如:1:对每个元素依次进行赋值$name[0]=“du”;$name[1]=“jian”;$name[3]=“sheng”;2:对整个数组进行赋值@name=qw/dujiansheng/;Perl语言\n数组名与标量变量名数组名和标量名称是完全分开的,perl允许在同个程序中:数组名和标量变量名相同如:$name[0]=“dujiansheng”$name=“dujiansheng”,尽管允许这样做,但还是建议不要这样做,容易混淆!Perl语言\n数组1:引用不存在的数组元素,得到的值将是:undef2:数组元素的下标(索引值)是整型数值Perl语言\n数组最后一个索引值(数组$name[99])1:$var=$#name;得到的结果便是数组的最后一个索引值2:采用负索引值:-1表示最后一个索引值;-2表示倒数第二个索引值…依次类推;即$name[-1]的值与$name[99]表示同个值Perl语言\n其它(数组)1:数组不能包含数组2:数组可以相互赋值(也就是复制)3:列表不能包含数组4:将列表赋值给数组时,要么将列表放在()中,要么使用qw/../进行赋值Perl语言\n操作符pop和push假如数组:@name=qw/dujiansheng/;1:取出数组@name的最后一个元素,并将其赋值于标量变量:$var$var=pop(@name);执行pop后,数组元素将减少一个2:在数组@name最后加入一个元素,执行后数组将增加一个元素Push(@name,tianhaiyan);Push@name,”tianhaiyan”;Push@name,1..10;特别注意:pop和push的唯一参数必须是:数组变量Perl语言\n操作符pop和push1:对于空的数据,它们的返回值就是:undefPerl语言\n操作符shift和unshif(对数组开头进行操作)1:shift是取出数组第一个元素,剩下的元素依次向左移动2:unshift是在函数开头加入一个元素,原先的元素依次向右移动Perl语言\n操作符shift和unshif(对数组开头进行操作1:对于空的数据,它们的返回值就是:undefPerl语言\n字符串内替换数组1:当数组中的值被替换到双引号内的字符串中时,数组中的相邻元素会自动添加“空格”如:@name=qw/dujiansheng/;Print“mynameis@name”;输出:mynameisdujiansheng特别注意:第一元素的前面和最后一元素的后面不会自动添加空格2:遍历数组:print@name特别注意:email中的@小老鼠符号Perl语言\n索引下标数组的索引下标可以使用表达式,当表达中含有变量时,perl在处理索引时,会事先进行替换,如:$var=4;@name=qw/mynameisdujiansheng/;$my_name=$name[$var-1];程序输出:duPerl语言\n控制结构foreach作用:对数组的元素进行遍历@name=qw/mynameisdujiansheng/;操作:foreach$var(@name){Print$var;}注意:假设标量变量$var在执行循环前有自己的赋值,即$var=“unknow”;那么在执行循环的过程中perl会先保存其的值,等执行循环后,perl会复原其的值,即$var=“unknow”,也就是其值没有发生变化Perl语言\n控制结构foreach作用:对数组的元素进行遍历@name=qw/mynameisdujiansheng/;操作:foreach$var(@name)假如在操作之前,我们不用变量$var会怎么样呢?答案是:perl最喜欢默认”$_”新的循环将是:foreach(@name){print$_;}这是perl的第一个默认变量Perl语言\n操作符reverse(针对列表进行说明)作用:读取列表的值,然后返回倒序的列表值,但是不会改变其的参数如:@name=qw/dujiansheng/;@list=reverse(@name);即:@list的值为”shengjiandu”但是@name的值没有改变,还是“dujiansheng”Perl语言\n标量上下文与列表上下文标题的意思就是:同一个表达式出现在不同的"地方"表达不同的意思其中“地方”就是特指:上下文Perl语言---最重要的小节\n1:标量上下文例如:56+sth;这个表达式会是什么样的意思呢?sth是标量还是列表?首先“+”是算术运算操作符,在算术运算中,它是双目运算符;而双目运算符的两个操作数是只能是单形式,也就是操作数只能是一个值(决不能是:连续的,多数量的值),所以以sth就是一个标量;至于它是一个常量,还是一个变量,都没有关系,最关键的是它是一个标量(单数形式)Perl语言---最重要的小节\n2:标量上下文56+@sth;这个表达式有一个数组(复数;数组拥有连续的,多个数量的值);那么这个表达式表达什么意思呢?首先这个表达式中的:算术运算操作符,而算术操作符的两上操作数必须是单数形式;那么这这个数组的单数形式又是什么呢?仔细想想:1要么是单个数组元素;2要么是元素的数量如果要是数组元素时,那么这种引用的方法不对,应该采用下标形式;那只能是元素的数量请说说:$var=@sth;该数组返回的是一个什么样的值?Perl语言---最重要的小节\n3:标量上下文56+@sth;这个表达式有一个数组(复数;数组拥有连续的,多个数量的值);那么这个表达式表达什么意思呢?首先这个表达式中的:算术运算操作符,而算术操作符的两上操作数必须是单数形式;那么这这个数组的单数形式又是什么呢?仔细想想:1要么是单个数组元素;2要么是元素的数量如果要是数组元素时,那么这种引用的方法不对,应该采用下标形式;那只能是元素的数量请说说:$var=@sth;该数组返回的是一个什么样的值?Perl语言---最重要的小节\n4:标量上下文假函数:scalar强制列表转换为标量,如print"scalar@name";该表达式只能返回:数组元素个数Perl语言---最重要的小节\n1:列表上下文@sth="du";这个表达式,其实就是要给数组赋值;数组是一个复数,因此将du赋值给数组@sth的下标为[0]的元素(即:@sth[0]=“du”)Perl语言---最重要的小节\n2:列表上下文($husband,$wife)=qw/dujianshengtianhaiyan/;这是列表操作(复数),它只能用在数组或者列表中,请注意列表只能包含在()中Perl语言---最重要的小节\n3:列表上下文($self)="dujiansheng"分析:首先这个表达式有一个();目前为止只有列表拥有()操作符;那么它只能是列表操作,实际上就是列表操作;列表操作只能是复数Perl语言---最重要的小节\n4:列表上下文中的操作符:标量上下文:返回输入数据的下一行:chomp($var=)列表上下文:返回剩余的各行,直到文件结尾为止;以换行符进行分隔为单独的元素:chomp(@array=)请操作实验Perl语言---最重要的小节\n自定义函数语法:subfunction_name{Statements;}1:函数具有全局性2:每个函数都有一个返回值Perl语言\n调用函数语法:&fun_name;只要在自定义函数的前面加上:&即可Perl语言\n函数返回值及其它1:任何函数都有返回值2:最后一个表达式的值作为整个子函数的返回值3:可以使用:return自定义返回值4:perl允许返回列表或者数组5:声明的变量默认情况下是:全局作用域,除非使用关键字“my”Perl语言\n参数函数可以拥有参数,perl也允许将参数列表传递到函数中,方法如下:只要在函数的后面用圆括号括住,然后将参数列表放在其中就行了,如&name(du,jian,sheng)1:每个参数用逗号进行分隔2:所有的参数都被自动存入到"@_"这个特殊的数组变量中,而且都是依次进行存储,如:$_[0]的输出就是:du;然后依次进行访问(特别注意:@_是数组名,引用数组元素时:$_[0],$_[1])3:多余的参数会被忽略4:参数的个数为:$var=@_;5:将数组的元素赋给列表变量,如:($name1,$name2,$name3)=@_;Perl语言\n私有变量关键字:my声明方法:1:my$var;2:my($name1,$name2,$name3);3:my($name1,$name2,$name3)=@_;4:my($name1,$name2,$name3)=qw/dujiansheng/;这些变量的作用域:本函数内部可以使用Perl语言\n精典程序(找出列表中最大的数字)子函数:$largest=&find_largest_num(1,6,3,8,2,9,12);subfind_largest_num{my$var=shift@_;foreach(@_){if($var<$_){$var=$_;}}return$var;}Perl语言\n关键词1:sub用于声明函数2:&用于调用函数(如果函数的声明放在函数的调用前,那么可以省略掉“&”)3:my用于声明私有变量4:state用于声明持久性私有变量Perl语言\nstate持久性私有变量什么是:持久性私有变量?就是在函数中调不用重新声明私有变量如:state$name="dujiansheng"目前perl禁止在列表中使用statePerl语言\n关键词my说明1:可以用来声明私有变量(具有函数作用域)2:可以用来声明私有数组(具有函数作用域)如:my@name;3:可以用来声明列表变量(具有函数作用域)如:my($name1,$name2,$name3);Perl语言\n编译命令usestrict作用:强制性的让perl拥有一点"纪律规则"1:使用变量量前必须进行声明2:调用函数前也要声明3:建议声明变量的同时进行初始化(如果想为0的话就不用)Perl语言\n操作符return1:函数可以拥有一个返回值,但是perl规定:函数最后一个表达式的值作为整个函数的值返回2:假如我们想要返回另一个值应该怎么做呢?第一种方法:使用变量保存该值,且将其写在最后一条语句中第二种方法:使用return进行返回;语法:return$var;3:函数可以返回:列表值(数组也可以返回)Perl语言\n输入与输出1:读取标准输入:通常情况下的操作方法$line=;Chomp($line);将以上两步进行合并Chomp($line=);如果将其用在while循环中While(chomp($line=))Perl语言\nWhile(chomp($line=))这个表达式虽然正确,但是实在太长,而且容易写错;这个表达式的意思很明确:如果读到文件的结尾(endoffile:ctrl+d)时,就结束循环既然意思明确了,因此larry找了一个无用的表达式,赋予其有用的意义:While()它的意思和While(chomp($line=))表达的相同,而且它特别的短请记住:perl的哲学1:去除不必要的限制(这是作者说的)2:尽量多使用简写形式和特殊变量(这是程序的感觉)Perl语言\n3:列表上下文($self)="dujiansheng"分析:首先这个表达式有一个();目前为止只有列表拥有()操作符;那么它只能是列表操作,实际上就是列表操作;列表操作只能是复数Perl语言---最重要的小节\n输入输出2:整行输入操作符()和perl最喜爱的默认变量$_之间的关联1>:一般情况下无关联2>:在特定的控制操作符中就有关联了,如Foreach(){Print$_;}$_保存了来自标准输入的数据,直到遇到(endoffile)Perl语言\n输入输出<>符号:<>称作“钻石操作符”作用:接受数据流,该数据流可能来自标准输入(键盘),也可能来自其它文件解释:如果某个参数是“-”时,说明数据流来自标准输入(键盘);如果是参数是文件名,那么接受来自文件数据流,如While(defined($line=<>))该表达式直到遇到文件结尾符号(endoffile)才终止循环,和前面的表达式意义相同Perl语言\n标准输入“-”如果从标准输入获取数据,那么当前文件名是:“-”Perl语言\n数组@ARGV数组:它是系统默认提供用于存储参数的数组,在程序开始运行时,它已经指导所有参数存储到其中了;Perl语言\n也可以对这个表达式进行简写,让它和前面的表达式表达相同的意义While(<>){Print$_;}需要注意:如果后面跟有两个文件参数,在切换到另一个文件时,中间并没有间断;因为钻石操作符在遇到最后一个文件的结尾符号(endoffile)才能返回under,从而终止循环Perl语言\n调用参数钻石操作符其实不会真的去检查调用参数,它靠的是@ARGV数组,这个数组是perl事先已经建立好的特殊数组(其实和自建的数组一样)钻石操作符如何决定使用那些文件名:方法如下,它会查找@ARGV数组如果找到的是空列表,就会改用标准输入流,否则就会使用@ARGV数组的文件列表,当然我们也可以改变@ARGV如:@ARGV=qw/myname.txtyourname.txt/;Perl语言\n标准输出Print操作会读取一个列表里所有的值,并把每个项目依次送到标准输出请说明下列表达式:(设:my@name=qw/dujiansheng/;)Print@name;Print“@name”;Perl语言\nPrint@name这个表达式会将数组中的每个元素依次输出至标准输出,而且每个相邻元素之间是“不会”加入空格的,即:“dujiansheng”Print“@name”这个表达式也会将数组中的每个元素依次输出至标准输出,并且会在每个相邻的元素之间“加入空格”,即:“dujiansheng”,当然这个空格又是perl的另一个默认值Perl语言\n输出格式化printfPrintf“%g%d%s%f”,2.3,45,dujiansheng,63.2;分别代表:通用浮点,十进制,字符串,浮点具体用法可以参照C语言Perl语言\n数组与printfPerl语言\n文件句柄什么是文件句柄:perl语言自己无法打开文件,只能求助于操作系统邦自己打开文件;而操作系统将文件打开,又如何送给perl语言呢---这就必须借助于文件句柄,文件句柄就是操作系统和perl语言之间“通信”的桥梁!Perl语言\n文件句柄命名规则:1:以字母,下划线,数字组成2:不得以数字开头3:建议使用全部大写的进行命令以下是perl语言的特殊文件句柄(建议不要重命名):STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUTPerl语言\n如何使用文件句柄(/home/dujiansheng/file/name)1:打开文件句柄(读取)#!/bin/perl–wOpenFILE,”<”,”/home/dujiansheng/file/name”;@file=;Foreach(@file){Print$_;}CloseFILE;Perl语言\n如何使用文件句柄(/home/dujiansheng/file/name)2:打开文件句柄(写入)OpenFILE,”>”,”/home/dujiansheng/file/name”;$var=“mydaughternameisduchenao!”;PrintFILE“$var”;CloseFILE;Perl语言\n如何使用文件句柄(/home/dujiansheng/file/name)3:打开文件句柄(读取,写入)OpenW_FILE,”>”,”/home/dujiansheng/file/name”;OpenR_FILE,”<”,”/home/dujiansheng/name”;$var=;PrintFILE“$var”;CloseW_FILE;CloseR_FILE;Perl语言\n不良文件句柄处理使用命令:die送出错误信息!第一种方法My$var=openFILE,”>”,”/home/dujiansheng/name”;If(!$var){Die“不能打开文件!”;}Perl语言\n请注意符号:$!如:if(!openFILE,”<”,”/home/dujiansheng/name”){die“不能打开文件:$!”;}它代表操作系统给出不能打开该文件的错误信息;die还会自动将程序名称和行号自动的附加到错误信息的后面Perl语言\n函数say作用:输出,并且会在每行的结尾处自动加上换行符如:say“dujiansheng!”;同样:加上双引号的字符串,文件句柄同样可以在函数say中使用,除了会自动在尾部上加上换行符以外,其它操作都一样Say在5.10中支持不是很稳定,建议不要使用!Perl语言\n什么是散列?1:散列是一种数据结构2:可以包含任意多个值,并能让程序员自由的使用这些值3:散列是用名称为找寻相应的值4:散列的索引值,此处称为”键”(而是互不相同的任意字符串)5:首先键是字符串,所以才会用字符串访问散列元素6:散列的值可以相同,但是键值绝对是不能相同7:散列是键--值的关系Perl语言------散列(哈希)\n散列限制与非限制1:同一个散列的键必须是互不相同的字符串2:散列的值可以是任意字符串3:散列可以是任意大小4:散列没有固定的顺序5:散列可以相互复制6:散列使用花括号{}与%Perl语言------散列\n建立散列(通常使用:=>胖箭头)My%class_name=(“dujiansheng”=>”dujiansheng”,“tianhaiyan”=>”tianhaiya”,“duchenao”=>”duchenao”,);1:建议采用这种方法进行初始化2:列表的结尾是一个”分号”3:整个列表以一个额外的逗号结束4:初始化时使用圆括号Perl语言------散列\n访问散列初始化单化散列元素:$class_name{“dujiansheng”}=“杜建生”;1:引用单个散列元素:print“$class_name{“dujiansheng”}”;2:引用单个散列元素:print“$class_name{$name}”;$name=“”dujiansheng;Perl语言------散列\n提取散列的键及值1:函数keys提取散列的键My@key_str=keys%class_name;2:函数values提取散列的值My@values_str=values%class_name;Perl语言------散列\n遍历散列函数:each返回:返回一组“键-值”值如:My($key_str,$values_str)=each%class_name;没有键值对应时循环结束Perl语言------散列\n函数exists作用:查看某个键是否在散列中如:If(exists%class_name{“dujiansheng”}){Print“该键值存在!”;}Perl语言------散列\n函数delete作用:从散列表中移除所指定的键值My$var=“dujiansheng”;Delete%class_name{$var};Perl语言------散列\n哈希的特殊用法(布尔量)If(%name){Print“这个哈希有值存在!”;}把哈希当成布尔量来操作,意思就是:如果哈希不为空时条件就成立;不过很少有人会这样做!Perl语言------散列\n%ENV哈希Perl运行在某个环境中,当然就需要对系统环境有所感知,perl获取的方法就是:存取%ENV哈希如:从PATH中取出路径Print“PATHis$ENV{PATH}\n”;Perl语言------散列\nperl中正则表达式是一个匹配与不匹配的关系(要么不匹配,要么匹配)简易模式perl中简易模式下,主要是匹配perl默认变量"$_"里的字符,如$_="dujiansheng";if(/du/){print"已经完成匹配";}Perl语言------正则表达式\n.(点号)匹配除换行符以外的任意字符*(星号)匹配任意一个字符0次或者多次?(问号)匹配条件:容许匹配紧邻前一个字符出现0次或者1次+(加号)匹配条件:容许匹配紧邻前一个字符出现1次或者多次Perl语言------正则表达式\n()圆括号:归组,具有记忆功能|竖线:择一匹配[]方括号:字符集-连字符:1:当连字符在[]中时,是元字符2:当连字符在字符集中字符的中间时,表示范围,如:[a-z]表示:小写字母a至z的所有小写字符3:当连字符处于最前面或者最后面,就表示它本身Perl语言------正则表达式\n^行开始(只能匹配行的开头)$行结尾(只能匹配行的结尾)\b...\b单词锚点(只能匹配单词)它们只匹配位置,而不匹配具体有字符Perl语言------正则表达式\n匹配符/.../匹配双斜线之间的字符,是m/.../的简写/s匹配任意字符(包含换行符)Perl语言------正则表达式\n修释符/i不区分大小写/x匹配模式中可以加空格,对整个表达式匹配无影响(也就是在匹配的时候会忽略整个模式中的空格)可以组合使用个修释符,次序不影响匹配的结果Perl语言------正则表达式\n(...)圆括号具有捕获功能系统自动将捕获的数据存放在系统变量$1...$n中,以备调用(?:..)取消了圆括号的捕获功能(也就是关闭记忆功能)Perl语言------正则表达式\n=~(绑定操作符)此操作符就是告诉perl拿右边的表达式去匹配左边的表达式(请注意写法)m/../简易的匹配,默认情况与$_进行匹配Perl语言------正则表达式\n\t制表符\n换行符\r回车符Perl语言------正则表达式\n字符集简写\s(小写)匹配所有空白字符(包括制表符,空格,回车,换行,换页等)特别注意与/s进行区别\w(小写)匹配[a-zA-Z0-9_](\w+可以匹配一个单词)但是不匹配空格\d(小写)匹配[0-9]\S(大写)匹配除空格之外的任意字符\D(大写)匹配除\d之外的任意字符\W(大写)匹配\w之外的任意字符Perl语言------正则表达式\n字符集简写\h匹配横向空白(其实就是包含:制表符和空格)\v匹配纵向空白(其实就是包含:换页符\f,换行符\n,回车符\r)\R匹配任何类型的断行(可以跨系统;比如:windows的换行与回车符合并在一起)Perl语言------正则表达式\n自动匹配变量$`:保存了除了正则表达式匹配部分前面的部分$':保存了除了正则表达式匹配部分后面的部分$&:保存了正则表达式匹配的部分如:if("dujiansheng"=~/\bjian\b/){print"$&\n";#输出jianprint"$`\n";#输出duprint"$'\n";#输出sheng}使用以上变量,整个程序执行速度会变慢Perl语言------正则表达式\n匹配优先级1:括号:()2:量词:*,+,?3:锚点:^,&,\b..\b,4:择一:|对于过于复杂的表达式要的仔细的考虑Perl语言------正则表达式\nperl的环视功能环视功能不匹配任何字符,只匹配文本中特定的位置;分为顺序环视和逆视环视,两者都的肯定和否定形式;顺序环视从左至右进行匹配,逆视环视从右至左进行匹配1:顺序肯定型环视(?=...)能够匹配表达式右边的文本2:顺序否定型环视(?!...)不能匹配表达式右边的文本3:逆视肯定型环视(?<=...)能够匹配表达式左边的文本4:逆视否定型环视(?PATTERN)调用捕获语法:$+{LABEL}请看实例:my$name=‘FredorBarney’;If($name=~/((?\w+)(?:and|or)(?\w+))/){print“Isaw$+{name1}and$+{name2}”;}\nPerl语言------正则表达式2:命名捕获(标签捕捉)在使用了标签捕捉后,反向引用也需要更新!$name=“dujianshengdujiansheng”;If($name=~m/(?\w+)(?\w+)(?\w+)\g{name1}\g{name2}\g{name3}/){Print“$+{name1}$+{name2}$+{name3}”;}输出:dujiansheng\nPerl语言------正则表达式更加通用的量词如:/a{5,15}/意思是:字母a出现的范围在5至15次以内1:如果省略5表示:匹配的上限是152:如果活力15表示:匹配的下限是53:如果省略逗号表示/a{5}:正好匹配5次\nPerl语言------正则表达式控制结构Unless(condition){Statements1;}else{Statements2;}这个表达式的作用是:1:当条件为假时,执行语句12:当条件为真时,跳过语句13:红色可选4:特别注意:这个控制结构只是一个判断控制结构!!!\nPerl语言------正则表达式控制结构Until(condition){Statements;}这是一个当条件不成立时执行循环体的控制循环结构1:当条件不成立时,执行循环体2:当条件成立时,跳过执行循环体3:特别注意:这是一个循环控制结构\nPerl语言------正则表达式控制结构“伪循环”特别注意:不要被“伪循环”所欺骗,实际上它只是执行了一次语法结构:{Statements;}语句体只是执行了一次!\nPerl语言------正则表达式控制结构Perl支持if判断语句,当然也支持elifIf(..){…}elif(..){..}elif(..){..}else{..}\nPerl语言------正则表达式单目运算符自增++自减--\nPerl语言------正则表达式控制结构For(初始化;测试;递增){Statements;}\nPerl语言------正则表达式循环控制1:last(相当于C语句中的break)作用:立即退出循环,只能跳出一层循环2:next(功能正好和C语言中的continue作用相反)作用:从当前语句直接跳到循环底部,让循环进入下一次:跌代3:redo作用:直接跳到循环的顶端,不经过任何的测试条件,进入下一次:循环迭代(也就是说重新执行本次循环)\nPerl语言------正则表达式循环控制4:标签命名:1:由字母,下划线,数字组成;但是不能以数字开头2:建议使用大写字母用法:将标签及一个冒号放在一个循环前面即可,随后可以使用:redonext,last跳至特别注意:标签是对整个块命名的LINE:while(..){……LastLINE;}\nPerl语言------正则表达式循环控制5:三目运算符condition?statement1:statement2;如果条件成立,执行语句1如果条件不成立,执行语句2\nPerl语言------正则表达式循环控制5:逻辑运算符1>:&&或者and2>:||或者or\nPerl语言------正则表达式操作符“定义否”也就是说当左的变量没有定义的时候,代码也能够正常工作,以不至于出现严重错误!如:My$var=$name//‘dujiansheng’;也就是当变量$name在没有定义赋值的情况下使用引变量而不至于引发错误所以就给出了默认值:dujiansheng\nPerl语言------正则表达式操作符“定义否”也就是说当左的变量没有定义的时候,代码也能够正常工作,以不至于出现严重错误!如:My$var=$name//‘dujiansheng’;也就是当变量$name在没有定义赋值的情况下使用引变量而不至于引发错误所以就给出了默认值:dujiansheng\nPerl语言------正则表达式文件测试1:检查某个文件是否存在OpenFILE,”<”,”/home/dujiansheng/name”;If(-eFILE){Print“该文件存在”;}else{Print“该文件不存在!”;}这是利用文件句柄进行操作\nPerl语言------正则表达式文件测试2:检查某个文件是否存在My@file=qw/name1name2name3name4/;Foreach(@file){If(-e$_){print“$_文件存在!”;}else{print“$_文件不存在!”;}}检查文件是否存在及其它这样做最方便\nPerl语言------正则表达式文件测试3:检查某个文件是否存在如果一次想多测试几项内容,可以使用逻辑运算符andorIf(..And..){..}\nPerl语言------正则表达式文件测试P205

相关文档