perl学习笔记.doc_第1页
perl学习笔记.doc_第2页
perl学习笔记.doc_第3页
perl学习笔记.doc_第4页
perl学习笔记.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Perl学习笔记#!/usr/bin/perl -w # -w option, warning#单引号字符串hello,world.n #n不会当作换行符来处理,而是当作两个字符和n。只有后面跟的是或,才当作特殊字符处理。单引号中的变量将无法扩展开。双引号字符串Hello,world.n #n会直接当作换行符处理。在双引号中的变量将会扩展开来。转义字符的意义formfeedb 退格a 响铃e escape(ASCII 中的escape 字符)007 任何八进制值(这里是,007=bell(响铃))x7f 任何十六进制值(这里是,007=bell)cC 一个控制符(这里是,ctrl +c) 反斜线” 双引号l 下个字符小写L 接着的字符均小写直到Eu 下个字符大写U 接着的字符均大写直到EQ 在non-word 字符前加上,直到EE 结束L,E 和Q#字符串的操作.来连接,x小写字母x表示左便字符串重复的次数hello.world #=helloworldfred x 3 #=fredfredfred如果x后面是个小数,如3.6,会转换为3再处理;0.8会转换为0数字和字符串之间会根据操作符号相互转换,如果操作符号是+,perl会把操作数当作数字看;如果是./x,则会当作字符串来看。当作数字的时候,字符串后面的非数字不分和前面的空格将去掉,如12fred34*3=36,不含任何数字的字符串被当作0。#变量命名大小写区分,由字母、数字和下划线组成,但不能由数字开头。变量的赋值和引用都要加$符号,而在shell中,只在引用变量的时候需要加$。#操作符号优先级,同C语言先乘除后加减,同优先级的从左到右,可用括号提升优先级。比较运算符,同C语言=, !=, , =, =perl没有bool类型,如果值是数字,0为false,其余是真;如果值是字符串,空串是false,其余是真;其他类型 的变量转换为数字或字符串后再判断。可取反。#用户输入 ,从键盘输入$lines=可以对$lines进行操作了行输入操作到达文件结尾时,返回undef。用defined操作时返回false,用于循环退出。while(defined($line=) .chomp,去掉字符串结尾的换行符号;chomp($text);或chomp $text;#如果text结尾有换行符,就去掉;有多个换行符,只去掉最后一个;没有换行符,则不进行处理,直接返回。返回值为去掉的字符个数,没有什么用。$num=chomp $text; # $num的值为1。#while 控制语句,同C语言undef,变量被初始化之前被赋值为undef,如果变量是数字,undef被解释成0;如果变量是字符串,undef被解释成空串。#数组和列表,其元素值可以是不同类型的,但通常都是同类型的。其容量没有限制,从0 到可用内存的上限。数组和标量属于完全不同的命名空间,所以标量$fred和数组$fred是两个不同的事物,perl会正确的区分开来。如果下标超出了数组范围,其值为undef,就像没有初始化的标量一样。数组$fred的最后一个元素的索引为$#fred, 数组的负数索引值是从最后一个元素开始,但不循环。 一般只用-1,$fred-1表示fred的最后一个元素。#列表,由括号括起来,并且元素由逗号分割开的列表。(1,2,3) #() #空列表(1.100) #包含100个整数的列表,范围操作,创建从左值到右值之间所有值的列表。() # =(1,2,3,4,5), 最小值和最大值被转换成整数。(5.1) #=空表,左值应小于右值,否则为空(0,2.6,10,12) #=(0,2,3,4,5,6,10,12)字符串列表,(fred, barne, bettry, dodo) qw(fred barney bettry wilma dono) #效果同上。#列表赋值($fred, $barney, $dino)=(hello, kitty, world);如果右边的值多,则额外的值会被自动忽略。如果是数组,如果$rock之前非空,这个操作不会改变其值($rocks0,$rocks1,$rocks2,$rocks3) = qw/talc mica feldspar quartz/;数组不能成为列表的元素,因为数组不能包含其他的数组。未经初始化的数组为空表。在数组名前面加可引用整个数组,rocks=qw/bedrock slate lava/;#从效率上讲,perl中数组使用索引效率很低,远没有C语言使用索引快。所以perl中要尽量避免使用索引。pop操作,将数组的最后一个元素取出,并返回该元素的值。arrar=5.9;$fred = pop(array); #array=(5,6,7,8)$barney=pop array; #array=(5,6,7)pop array; #array=(5,6)如果去掉括号,含义不变,那么括号就可以去掉。push操作,将一个或多个元素添加在数组的末尾。push(array, 0); #array=5,6,0push array,8; #array=5,6,0,8push array, 1.10; #array=5,6,0,8,1,2,3,4,5,6,7,8,9,10shift/unshift对数组的开头进行操作,shift从开头取出数据,并返回该数据的值;unshift将数据插入数组头部。格式类似pop/push。#数组可以插入双引号字符串中print quart rocks limestonen;如果要打印字符,需要加转移字符。或者用单括号括起来。#foreach循环控制,从数组或列表的第一个元素一直到最后一个元素。foreach $roch(qw/ bedrock slate lava /) print one rock is $rock.n;$Perl语言入门 第四版 P462008-05-17#第四章 subroutine 相当于用户自定义的函数用关键字sub开头sub marine . $fred; #返回值,程序中最后一个表达式的值。 #不见得是最后一行,如在选择语句中返回结果。用&+函数名来调用$a=&marine;如果编译器在调用之前知道此子程序的定义,或者perl从语法重能知道这是一个子程序调用,则&是可以省略的。带参数,参数列表自动的存放在一个_的数组中,可以用$_0/$_1/.来访问各个参数。但形参不必体现出来。sub max if ($_0 $_1) $_0; else $_1; 调用$sum = &max(10, 15);perl不进行严格的检查,当参数多于两个时,多余的参数被忽略;参数不够时,不够的参数会得到undef这个值。私有变量,用关键字my创建;sub max if(_!=2). #可以直接用_来测试参数的个数。 my($a, $b); #a/b就是局部变量,max执行完之后自动销毁 $a=.; $b=.; .参数个数没有限制,因为perl的设计哲学是“没有不必要的限制”。#perl是一种很宽松的语言,如果你希望perl严格以下,可以使用strick pragma。在程序顶端(或者你需要的程序块、文件中)加入:use strict;2008-05-17 Perl语言入门P66#第五章 输入输出$line=; #读入一行chomp($line=); #去掉结尾的换行符号行输入操作到达文件结尾时将返回undef,循环退出时很有用:while(defined($line=) .简写为while() . print $_; #在这里默认参数$_表示输入的一行数据。foreach() print $_;推荐使用while循环,一次只读入一行数据。#命令行参数如果没有命令行参数,程序将处理标准输入流。如果将-作为一个参数,也代表标准输入流。如果调用参数fred - betty,其含义是程序先处理文件fred,再处理标准输入流,最后处理betty文件。,diamond operator, Lary的女儿命名的,是一种特殊的行输入操作。如果没有参数,将代表标准输入;如果有参数,就表示参数代表的文件的一行while() #将输出参数表示的文件的内容 print $_;读入输入,但输入的内容存储在$_里;避免在一个程序里重复使用;从数组ARGV中得到调用参数。程序运行时,参数已经被存放在ARGV中了。在程序启动后,使用前,还有机会修改ARGV的值。#格式化输出printf,类似C语言的printfprintf %10sn, wilma; #00000wilma 前边的0代表补齐10位的空格printf %-10sn, wilma; #wilma00000 后边的0代表补齐10位的空格printf %12fn,6*7+2/3; #00042.6666667默认的是12.6,即总共12位,小数点后有6位printf %12.3fn,6*7+2/3; #00000042.667printf %12.0fn,6*7+2/3; #000000000043%d #十进制证书%g #自动选择数字的类型,整数、浮点数等#2008-05-23句柄filehandle是perl程序IO连接的名字,而非文件的名字。跟普通变量的命名规则一样,但为了和标签区别,推荐所有的文件句柄名字都大写。perl自身带有六个文件句柄:STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUT指定标准输入、输出和错误输出,$./your_program out_file将从in_file中读入数据处理,将结果输出到out_file中,$./your_program /tmp/error将错误信息输出到/tmp/error文件中打开文件open FILE1,dino; #只读方式打开open FILE1,dino; #写操作打开open LOG,logfile;#追加方式打开Perl5.6版本以后,也可以这么写:open FILE1,$file_name;open FILE2,$file_out;my $output=my_out;open LOG, $output; #注意后边有个空格,perl将忽略这个空格,但这么做可以防止意外;如果没有这个空格,$output=my_out,这里LOG就变成了方式打开。perl自身不能打开文件,和其他的语言类似,perl请求操作系统打开,如果权限不对,操作系统会拒绝打开。输入、输出操作结束时,用close来关闭文件句柄。close FILE1;close LOG;发生严重错误,如文件打不开,除数为0等的时候,使用die立即退出程序。open(LOG,logfile) | die Cannot create logfile:#!;最后die将程序的名字和出错的行数输出在消息的末尾。在die消息末尾加上换行符,则不打印程序名和行号。dir Cannot create logfile.n;也可以使用warn函数来产生警告信息,也会打印程序的名字和行号,但不退出。$默认的输出是STDOUT,也可以使用select 文件句柄;给print(f)改变默认的输出,select LOG;print application start normally.n; #将输出这句话到LOG文件里。$如果重新打开文件句柄LOG,之前打开的LOG句柄讲被自动关闭。如果重新打开没有成功,仍将使用之前的设置。可以用这个特性产生私有的log,open STDERR, /home/barry/.err_log | die Cant open log file: $!;$reverse操作1、fred=6.10; fred=reverse fred; #fred=10 9 8 7 6;2、print reverse ; #将从命令行参数得到的输入反转,并将参数表示的文件内容反转,先输出最后一行,最后输出第一行。$程序分析:while() #由于标准输入末尾的换行符号没有去掉, #chomp printf %20s, $_; #这样的输出看起来好像是19位对齐的。可以在上面这一行加入chomp解决这一问题。chomp(my lines=); #一次读取所有的输入到一个数组里,同时去掉每一行的换行符号print 1234567890 x 7, n;foreach (lines) printf %20sn,$_; #这样输出就会20字符对齐。第五章结束 2008-05-23#2008-05-24 第六章 hash表perl采用了优秀的hash算法,当hash表很大时,速度也非常快。大的hash表,对性能没有影响。hash表元素的赋值,key用包括,在数组中是用;$family_namefred = flintstone;$family_namebarney = rubble;print $family_namefred; #将打印flintstone$family_namebarney = Green; #如果给已经赋值的数对赋值,会覆盖以前的赋值。%family_name #整体引用hash表%some_hash=(foo,13,bar,12.5,2.5,hello);#用列表给hash赋值,元素必须为偶数个。#形成的hash数对为:# foo -13# bar -12.5# 2.5 -hellosome_array=%some_hash #将hash展开赋值给数组。print some_arrayn; #将数对一一打印出来,但顺序可能就不一样了。$Hash赋值%new_hash=%old_hash; #hash copy,很少这么做%new_bash=reverse %any_hash; #将any_hash展开成数组,翻转后赋值给new_hash翻转后,原来hash表的value成了新hash的key,原来hash表的key成了新hash的value;只有当原来hash表的value也是唯一值时这个操作可以很好的工作,否则将不能得到预期的结果。$=符号hash表较大时,除了仔细的计数,不容易判断哪个是key,哪个是value。因此发明了=符号。perl中,=称作旁逗号(fat comma),其作用和,类似,需要逗号,的时候,都可以使用大箭头=替换,my %last_name=(fred = flintstone,dino = undef;barney= rubble;betty = rubble;);$hash的函数my %hash=(a=1, b=2, c=3);my k = keys %hash; #keys函数返回hash表的所有keymy $cont = keys %hash; #返回hash中(key/value)数对的个数my v = values %hash; #values函数返回hash表的所有value。我们并不维护hash表中元素的顺序,并不关心a对在前还是b对在前,只是确保a的后边一定是1,b的后边一定是2;如果添加元素进hash表,perl会重新给表排序,以便更方便的访问。#each函数,返回hash表中的下一个数对的列表,直到末尾,返回空表。下面的程序对hash进行遍历并打印出来while($key, $value) = each %hash) print $key=%$valuen;if (exists $book$dino) #exists察看hash中是否存在某个key,不管这个key有无对应的value。有,返回true;无,返回false。 .delete $bookbetty; #将betty对应的数对从hash表中删除#2008-05-25第七章 正则表达式 regular expressionsshell中的文件名匹配模式叫globs,和正则表达式有很多相似的地方,但不一样。正则表达式由/括起来;凡是双引号中可用的转义字符,在/中都可以使用。元字符,特殊字符.-表示一个任意字符,不包括换行符。-转移字符。*-匹配前一项0次或多次,如/fredt*barney/匹配frdd和barney之间有0个或多个制表符的字串。和.一起使用,匹配任意个任意字符.+-匹配前一项一次或多次。/fred +barney/匹配两个单词之间至少有一个(可以有多个)空格的字串。?-匹配前一项出现(一次)和不出现(0次),/fred ?barney/只匹配出现fredbarney和fred barney的字串.()-表示分组,/(fred)+/能匹配fred和fredfred|-或,/fred|barney/可以匹配出现fred或者barney的字串。-匹配内出现的任意单字符,/abc/匹配出现a、b或者c的字串;-连字符,表示某个范围内的字母,/a-e/等价于/abcde/;但/hello-9/中的-不会被解释成连字符。-补集,a-c匹配不包含a、b、c的字串字符类的简写有一类字符很频繁的出现,因此提供了简写的形式。d-表示任意数字 0-9w-表示word字符,这里对word的定义是由字母、数字、下划线组成的单词,A-Za-z0-9_; 用w+匹配一个单词;s-white space,空白字符,包括格式符/制表符/换行符/回车/空格,ftnr d-不包含数字的字串,也可以用大写表示D;w-不包含word字符的字串,也可以用大写表示W;s-不包含空白字符的字串,也可以用大写表示S。#第八章正则表达式在perl中的应用m/, /是m/的简写形式,同qw/操作一样,可以使用任何成对的分割符,如m(fred),m,m#fred#,或者m,fred,,mfred都可以。大多数的时候,大家都用/,但有的时候/在匹配模式中出现,如匹配http:/的时候写成/http:/不如写成m%htpp:/%更直观、易于维护./i-不区分大小写/s-让.匹配任何字符。正常情况下.不匹配换行符,多行查找的时候,可以用/s修饰,使之匹配任何字符,包括换行符。作用类似于dD./x-忽略模式中任何数量的空白,便于将代码排版、易于阅读。 如/-?d+.?d*/,不容易知道其含义。使用/x后好很多,可以加上注释: /-? #有或者没有负号 d+ #一个以上的数字 .? #小数点 d* #小数点后的数字 /x 这几个字符可以结合起来用,他们之间的顺序不重要,如: if (m fred #comment1 .* #comment2 barney #comment3 six ) . -匹配开头。/fred/匹配以fred开头的行;在字符类中,表示取补集。$-匹配结尾。/fred$/匹配以fred结尾的行。bb-匹配单词的两头儿。这里的单词仍然指的是由字母、数字、下划线组成的实体。BB-表示非单词开头和结尾的匹配。=-绑定匹配的源字符串,默认的是$_。使用=之后可以对任何字符串匹配。 my $some_str=I dream of betty rubble.n; if ($some_str = /brub/) . my $result = ($some_str = /brub/); #匹配到返回1,否则无值(打印出来是空的)变量可以在正则表达式里面展开。如/($hello)/。$1-匹配变量.使用()可以将模式的一部分组合起来,同时正则表达式会为()中 的字符串分配一个内存块,这样的内存块可以用$+数字来引用。 如: $_=hello there,neighbor; if(/(S+)(S+),(S+)/) print $1 $2 $3; #$1/$2/$3分别代表/中第1/2/3个括号()中匹配的内容 这些变量值$1/$2/$3一直保持不变,直到下一个模式成功匹配,被改写为新的匹配内容。 如果在正则表达式和使用$1之间加入了其他的正则表达式,则$1中记录的是第二个正则表达式 中匹配的内容,所以如果要在后面使用这个变量的值,应当将其拷贝到普通变量之中。$&-存储了匹配模式中所有()内匹配的内容。$-存储了匹配成功前本行的内容;$-存储了匹配位置之后的本行的内容; 如上面这个例子中, 源字符串hello, how are you?,/are/ 则$=hello, how ; $&=are; $= you?; 三个变量放一起,刚好是一行5,9-匹配前一项连续重复5到9次的字串。5,-匹配重复5次以上的字串,9-匹配重复9次以下的字串优先级() */./?/3,5 /$ |P107#08-05-26第九章 使用Regulator expressions处理文件s/ 替换,用法跟sed一样。s/barney/fred/; 用fred替换barney。 返回值,替换成功返回true;否则返回false;/g globe,全局替换;同sed中的功能一样;s/每行只进行一次替换,s/g进行全局替换; 同m/,qw/一样,s/也可以由其他字符来修饰,如#$等,分割符甚至可以不同: 如,s/fred/barney/和下面的是等价的: sfredbarney; sfred(barney); s#barney#;/i x s,除了/g之外,可以使用这些在匹配模式中使用的字符,可以组合使用,与顺序无关。 /i 忽略大小写; /x 忽略任何数量的空格; /s 让.匹配任何字符,包括换行符。$file_name = s/.*/ /g; #绑定处理对象。split操作,将由分隔符分开的子串作为列表返回。 如fields = split /:/, abc:de:fghi:lm; #返回abc,de,fghi,lm 两个分割符连在一起则返回空元素;开头的空元素会返回,结尾的空元素会被丢弃。 fields = split /:/, “:a:b:c:”; #得到(“”, “”, “”, “a”, “b”, “c”); /s+/作为分隔符是很常见的,连续的空白符号作为一个分隔符。 默认的情况下,split仍然对$_进行处理。field = split; #同split /s+/,$_;join, 同split的操作完全相反。 piece=qw/2 4 6 8 10/; my $result = join /:/, piece; # $result为2:4:6:8:10贪婪的数量词,前面使用的都是贪婪的数量词,*.+?,将进行最大限度的匹配。即第二个匹配从行尾(最大限度处)开始。如在字串fred hello kitty barney how are barney hi中,匹配/fred.+barney/,匹配到的字串是fred hello kitty barney how are barney;非贪婪数量词,/fred.+?barney/,匹配得到的字串是fred hello kitty barney;即从最小限度处开始匹配。+/*/?/的非贪婪数量词分别在原来的符号后面加?,为+?/*?/?/5,9?/8,?/m $是指整个字符串的开头和结尾(这个字符串可能包含好几行),使用/m选项后,可以针对每一行处理。也可以用于替换。 $lines= s/$filename: /gm;$I=.bak; 正常情况下,perl处理完文件后,将处理后的内容(删除/替换等操作)输出,而原文件的内容不变。如果$I里有值,则会将原文件名后面加上

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论