




已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
我的评价:本书是perl的经典入门书籍,介绍了perl中最基本的概念和语法,是perl入门的好书,我向所有想了解或学习perl语言的朋友推荐本书。书中穿插有perl语法形成的历史和原因,使你能充分感受到perl语言的文化,这也是perl流行的原动力。本书行文流畅,各知识点介绍到位,令人很容易明白,达到入门点睛的效果。但本书的作用也就是入门而已,目的很明确,它没有深入到perl脚本语言的高级部份。如果你想了解perl的高级功能或使用perl来更好地完成你的日常工作,还需进一步学习,perl语言编程应该是你最好的选择。第一章 简介1第二章 标量数据1第三章 列表和数组5第四章 子例程8第五章 散列(哈希 hash)10第六章 I/O基础12第七章 正则表达式的概念13第八章 正则表达式提高14第九章 使用正则表达式16第十章 更多的控制结构18第十一章 文件句柄和文件测试22第十二章 目录操作25第十三章 处理文件和目录26第十四章 进程管理29第十五章 字符串与排序31第十六章 简单数据库34第十七章 一些高级Perl技术37第一章 简介第二章 标量数据什么是村量数据?标量(scalar)是perl中最基本的元素。大多数标量要么是一个数字,要么是一个字符串。perl基本上把它们视为可相互替换的东西。数字所有数字的内部格式都一样在内部,perl一律把整数,浮点数按双精度浮点数进行计算。perl内部没有整数值-程序中的一个整数常量被当作等值的浮点数。直接量(literal)指的是在perl源代码中表示值的方式,浮点直接量 1.33,233.5,-3.9整数据直接量 0,89,-66,61_383_883_897_363(一个大数,用下划线以示清晰)非十进制整数直接量八进制直接量以0开头十六进制直接量以0x开头二进制以0b开头从5.6版本开始,perl允许在直接量中加下划线以示清晰。0x50_65_7c数值操作符加 + 2 + 3减 - 3 - 2乘 * 2 * 3除 / 2/3模 % 10%3指数 * 2*3字符串单引号字符串直接量 在引号间除了单引号或反斜杠以外的任何字符(包括换行符,如果该字符串连续占几行)在字符串中表示该字符本身。要想得到一个斜杠,需要连续写两个斜杠,要得到一个单引号,需要加一个斜杠。双引号字符串直接量 在双引号内的反斜杠开始发挥它的作用,可以用来指定特定的控制字符。可以在双引号里面内插变量。双引号内的转义字符完整列表n 换行r 回车t 制表符f 换页b 退格a 响铃e Esc(ascii的转义字符)007 任意ASCII码的八进制值(这里007=响铃)x7f 任意ASCII码的十六进制值(这里07f=删除)cC 任意Ctrl键组合字符(这里是Ctrl-C) 反斜杠 双引号l 下一个字母小写L 所有后面的字母小写,直到Eu 下一个字母大写U 所有后面的字母大写,直到EQ 添加反斜杠引用后面的非单词字符,直到EE 结束L,U,Q字符串操作符. 连接两个字符串 hello . world = helloworldx 串重复操作符 yang x 3=yangyangyang 次数使用前截成一个整数。4.8=4,小于1的拷贝次数会得到一个空串。数字与字符串的自动转换依赖于作用在标量值上的操作符。如果是+则是数据,如果是.则是字符串。z.6*7=z42 ,12*3=36perl的内置警告可以要求perl在发现你程序有异常时给你一个警告。使用 -w 选项。#!/usr/bin/perl -w标量变量变量(variable)是一个容器的名字,用以存放一个或多个值,变量的名字在程序中保护不变,但它所包含的值在执行过程中一般要不停地改变。在perl中用美元符号标识。$a,$test。选择好的变量名适当加一些下划线可让变量更易读,更易理解。标量赋值(assignment)操作符用等号,它的左边是变量名,右边是值。二元赋值操作符+= -= *= .= *= and so on用print输出print hello worldn;print the answer,6*6,.n;在字符串中替换标量变量$meal = brontosaurus steak;$barney = fred ate a $meal; 另一种写法 $barney = fred ate a.$meal;如果标量变量从未被赋过值,就用一个空串替换。操作符优先级和结合性善用小括号perlk中的操作符优先级和结合性与C一样 比较操作符相等 = eq不相等 != ne小于 gt小于等于 = geif控制结构if () .; else .; 布尔值perl中没有单独的的布尔数据类型,不过,它使用几条简单的规则。1、特殊值undef是假。2、0是假,所有其它的数字是真。3、空串是假,所有其它的字符串一般是真。4、一个例外,因为数字和字符是等价的,所以0的字符形式0,和它的数值形式有同样的值:假。! 是取反的意思,可以在真值前加,结果就变成了假。取得用户输入从键盘得到一个值。一般以n字符结束。所以可利用该字符做条件控制。chomp操作符它作用于一个变量,此变量必须存放一个字符串,如果这个字符串以换行符结尾,chomp就把它去掉。$text = a line of textn;chomp ($text); 去掉换行符chomp($text =); 最常用的方法,读文本,不带换行符chomp是一个函数,所有它有返回值,即去掉的字符个数。使用chomp时可以带或不带小括号,这是perl的另一个基本规则,除非去掉括号会改变意思,否则括号总是可有可无的。while控制结构重复执行一个代码块,只要条件为真。$count = 0;while ($count 10 ) $count +=1; print count is now $countn; 得到从1到10的值。 undef值变量在第一次赋值之前有特别的undef值,代表什么也没有。当把它作为字符串时,其功能相当于一个空串。当把它作为数字时,其功能相当于0。perl程序员经常这样使用。很多操作符在操作数超出范围或没有意义时会返回undef值,这样一般不是什么问题,但如果打开perl的警告,则会导至一个警告。defined函数测试一个值是undef还是非空字符串,可以使用这个函数。它对undef返回假,其它所有情况则返回真:$madon = ;if (defined($madon) print the input was $madon; else print no input available!n; 如果你想生成自已的undef值,可以用古怪的undef操作符$madon = undef; 好像它从来没有被动过第三章 列表和数组在perl中,如果“单数”是标量,那么“复数”则由列表和数组来表示。列表(list)是一个有序的标量集合,数组(array)是一个包含列表的变量。精确地说,列表是数据,而数组是变量,可以有一个不在数组的列表,但每个数组变量都包含一个列表。数组和列表可以放任意多的元素,最小的是没有元素,而最大的可以把所有内存耗尽。这符合perl的“没有不必要的限制”哲学。访问数组的元素数组元素用连续的整数编号,从0开始,然后按1递增。$fred0 = a;$fred1 = b;$fred2 = c;如果下标所指的元素超出了数组的区间,那么相应的值就是undef。特殊的数组索引如果你试图存储一个超出数组区间的数组元素,这个数组就会自动按需扩展,对它的长度没有限制,只要有足够的内存供perl使用。$rocks0 = a;$rocks1 = b;$rocks2 = c;$rocks10 = end; 现在就有6个undef元素。访问最后一个元素的索引是$#rocks。负的数组索引从数组尾部算起,-1代表最后个元素。列表直接量列表直接量(list literal)是小括号中的一列由逗号分隔的值。例如:(1,2,3,4) (“fred”,43.4) () (1.100) (0.$#rocks)“.”是区间操作符,能生成一个顺序列表。如上例中的从1到100。列表可包含表达式或变量。qw快捷方式qw表示“被括引的单词”(quoted words)或“用空白括住”(quoted by whitespace),perl按单引号字符串处理它们,所以你不能像在双引号字符串中那样在qw列表中用n或$fred)。qw /a b c d/ 等同于 (a,b,c,d)qw !a b c d! 等同于 (a,b,c,d)qw a b c d 等同于 (a,b,c,d)定界符可以选择任意的标点。列表赋值($fred,$barney,$dino) = (a,b,c)($fred,$barney) = ($barney,$fred) 交换它们的值,比c等语言方便很多。如果变量的个数小于值的个数,则多余的值会被无声地忽略。如果变量的个数多于值的个数,则多的变量会得到undef值。at符号可以一次指定整个数组。这样rocks代表“所有的rocks”。rocks = qw / a b c/;copy = quarry 从一个数组拷贝一个列表到另一个数组pop and push操作符正真的perl程序员不使用索引访问数组,这样发挥不了perl的强项。我们经常把数组当信息栈用。总是从列表的右侧加入新值或删除。pop操作取出一个数组的最后一个元素array = 5.9;$fred = pop(array); $fred得到9,array现在有(5,6,7,8)$barney = pop(array); $barney得到8,array现在有(5,6,7)如果数组是空的,pop就不管它,因为没有元素可删除,只返回undef。push操作与pop对应,它顺数组的最后添加一个元素或一个元素列表。push(array,0); array现在有(5,6,7,0)others = qw /1 2 3/;push array,others array现在有(5,6,7,0,1,2,3)注意:push的第一个参数或pop的唯一参数必须是一个数组变量,进栈和出栈对直接量列表来说是没有意义的。shift and unshift 操作类似于push and pop,shift and unshift对数组的头部进行相应的操作。在字符串中替换数组与标量一样,数组的值也可以被替换到双引号字符串中。print quartz rocks limestonen; 打印所有岩石,用空格分开。注意:不要把电子邮件地址放到双引号字符串中。foreach控制结构foreach循环遍历列表中的所有值,对每个值执行一个迭代(执行一次循环体)foreach $rocks ( qw /a b c/) print one rock is $rocks.n; 打印a b c。 Perl最喜欢的缺省变量:$_如果你在foreach循环的开始忽略了控制变量,perl就会使用$_。foreach (1.10) 缺省使用$_ print I can count to $_!n; $_ = a;print; 缺省打印$_reverse操作符reverse 取一个列表的值,然后返回相反顺序的列表。记住它只返回反序列表,并不影响它的参数,如果返回值不被赋给别的变量,它是不保存。sort操作符sort取一个列表的值,然后按照内部字符序进行排序。标量和列表上下文一个给定的表达式在不同的地方,可能会有不同的含义。5 + something something必须是个标量sort something something必须是个列表在标量上下文中使用列表生成表达式提供标量上下文的表达式:$fred = something;$fred3 = something;123 + somethingsomething +654;if (something) .while (something) .$fredsomething = something;提供列表上下文的表达式:fred = something;($fred,$barney) = something;($fred) = something;push fred,something;foreach $fred (something) .sort something;reverse something;print something;在列表上下文中使用标量生成表达式如果一个表达式在正常情况下不生成一个列表值,那么自然它就会生成标量值,即一个元素列表:fred = 6*7 得到一个单元素列表(42)注意,因为undef是个村标量值,所以给一个数组赋undef并不能清空数组,清空的更好方法是赋一个空列表()。强制使用标量上下文可以使用scalar假函数,它告诉perl提供一个标量上下文。rocks = qw /a b c d/;print i have,rocks,rocks!n; 错,打印了石头的名字print i have,scalar rocks,rocks!n; 正确,打印石头的数量列表上下文中的chomp (lines = ); 读入那些行,不带换行符第四章 子例程系统与用户函数perl的子例程可以让我们在一个程序中重复利用一块代码,子例程名字是在前面加一个可有可无的&符号,有一条规则规定什么时候可以省略。定义一个子例程使用关键字sub和子例程名定义。可以放在程序的任何位置。sub marine $n += 1; print hello ,sailor number $n!n; 注意:n 为全局变量调用子例程$marine; 输出hello,sailor number 1!$marine; 输出hello,sailor number 2!返回值每个子例程在运行过程中,计算值是它一系列动作的一部份。在子例程中得到的最后一个计算值自动成为返回值。因此注意在向子例程增加代码时要确保最后一个表达式的结果是你希望的返回值。“最后一个表达式”是指真正的、被最后计算的表达式,而不是正文的最后一行。参数参数列表在子例程运行期间被自动地赋给一个特别的数组变量_。子例程可以访问这个变量以确定参数个数和参数的值。也就是说,第一个参数被存在_0,第二个被存在_1中,其它依次类推。_变量是子例程的局部变量,如果_中有一个全局变量,它就会在子例程调用前被保存起来,而在子例程返回时恢复原值。子例程中的私有变量my操作符生成被称为词法变量(lexical variable)的私有变量。local操作符local的真正功能是把给定的变量的一个拷贝保存在一个秘密的地方(栈)。这个值在保存后不能被访问、修改、删除,读出、检查、打印等。在perl中没有办法以接近被保存的值。接着local把该变量设为空值(对标量是undef,对数组是空表),或设为任何赋给它的值。当perl从子例程中返回时,会自动将变量恢复为原先的值。从效果上来看,这个变量被暂时借用了片刻。local 和 my 的区别local是全局变量,可以想成“save”(在子例中调用时),在所有新代码中只用my,my比local快。可变长参数列表在perl中,经常传递给子例程任意长度的参数列表。子例程可以查看_数组,从而轻松地判断参数的个数。但在实际的perl编程中,这类检查几乎没有用过,最好是让子例程适应参数。一个允许任意参数的例程$maximum = &max(3,5,10,4,6);sub max my ($max_so_far) = shift _; foreach (_) if ( $_ $max_so_far) $max_so_far = $_; $max_so_far;这段代码使用了被称作“高水位线(high-water mark)的算法。在一次洪水之后,当水最后一次涨潮和退潮时,高水位线显示了曾经达到的最高水位。空的参数列表返回一个undef。词法(my)变量的说明my可以在任何块中使用,而不仅仅在子例程中。例如可以在if,while or foreach中。use strict pragmaperl是一种特别宽松的语言,但也许你想让perl把规则加强一些,这可以用user strict pragma(编译指示)来安排。pragma中给编译器的提示,告诉它关代码的一些信息,这里,use strict pragma是告诉perl编译器,它应该在本块或源文件的其余部份强制使用一些好的程序设计规则。return操作符该操作符立即从子例程中返回一个值。省略与字符(&)原则在除与内置函数名一致,其它子例程都可以省略与字符。第五章 散列(哈希 hash)什么是散列?散列(hash)是一个数据结构,与数组相同的是它可以含有任意数目的值并随意读取它们。但与数组中由数字对值进行索引不同,散列用名字(name)查找值。也就是说,索引不再是数字,而是任意的惟一字符串,称之为键(key)。它是一桶数据,不存在第一项,它是一团糟的,随意的,没有固定的顺序。键总是被转成字符串,如用数值50/20做键,它就会被变成“2.5”。散列可以任意大小,从空散列直以填满内存。在perl中巨大的散列并不可怕,从三个和三百万个键值对中取出一个数的速度差不了多少。为什么要用散列你有一组数据与另外一组数据相关。如名 姓主机名 ip地址ip地址 主机名单词 单词出现的次数用户名 用户使用的硬盘块数驾照号码 名字如果你的任务描述中包含“找到重复项”,“唯一的”,“交叉引用”,或“查表”之类的词语,那么散列就会在实现中很有用处。散列元素访问使用如下语法:$hash$some_key$ahome = first;$a(hotel = second;当你在一个已存在的散列中存入东西时,会覆盖以前的值。访问散列之外的元素会得到undef:$a = $btest; 这里没有test,得到undef。作为一个整体的散列要访问整个散列,就使用%号做前缀。为方便起见,可以将散列转换为一个列表,并转换回来,给散列赋值是一个列表上下文,这个表由键-值对组成%hash = (aa,33,bay,11,2.5,hello,cc,bbn);展开散列(unwind),把散列转换回键-值对应列表。次序乱了,但键-值还是成对出现的。array = %hashprint array;bay,11,2.5,hello,cc,bb(一个换行符),aa,33散列赋值%new_hash = %old_hash perl将%old_hash展开成一个键-值对列表,并赋值给%new_hash。%inverse_hash = reverse %any_hash 生成逆散列,键变值,值变键。前提是原散列值要唯一。大箭头用大箭头把散列中的键-值对组织起来。my %hash = ( aa = test1, bb = test2, cc = test3, 最后额外的逗号是无害的 );散列函数keys函数得到一个散列中所有当前键构成的一个列表,values函数得到一个相应的值。my %hash = (a = test1,b = test2,c =test3);my k = keys %hash 得到a,b,c。my v = values %hash 得到test1,test2,test3。在一人标量上下文中,这些函数给出散列的元素个数。my $count = keys %hash 得到3,即有三个键-值对。each函数该函数可以遍历一个完整的散列。每次返回一个键-值对作为一个二元元素列表。最后返回一个空列表。while ( ($key,$value) = each %hash ) print $key = $valuen; exists函数查看某键是否在散列中。存在就返回真,不存在就返回假。delete函数从散列中删除指定的键(和相应的值)。如无此键,它的任务就结束。此时没有警告或出错信息给出来。第六章 I/O基础从标准输入进行输入while (defined($line = ) print I saw $line; ;因为行输入操作符在你到达文件末尾时会返回undef,所以可以用它方便地跳出循环。从钻石操作符进行输入“”是一种特殊的行输入操作符,它可以是也可以不是来自键盘的输入。while (defined($line = ) chomp($line); print It was $line that I saw!n; ;如果用a,b,c三个参数调用该程序,将打印三个文件的内容。使用钻石操作符,就好像输入文件被合并到一个大文件中。上面程序可用快捷方式写成:while () chomp; print It was $_ that I saw!n; ;大多数linux标准工具中,短横-代表标准输入流。通常在一个程序中只用一个钻石操作符,当初学者在程序中放第二个钻石时,其实他们一般是想用$_。记住,钻石操作符读取输入,但输入本身是在$_中。调用参数钻石操作符并不是直接从字面上读取调用参数,它实际上读取ARGV数组。它被perl解释器预设为调用参数的列表。在程序中可以对该数组进行赋值等操作。ARGV = qw# a b c #; 强制读取这三个文件while () chomp; print It was $_ that I saw!n; ;向标准输出进行输出print array; aabbccprint array; aa bb ccprint ; cat 的源代码print sort ; sort 的源代码用printf进行格式化输出,和c类似。数组与printf可动态形成格式字符串。my items = qw ( a b c );my $format = the items are:n.(%10sn x items); 在标量上下文中使用items得到它的长度printf $format,items 在列表上下文中使用items得到它的内容上下文太重要了。要好好感受。第七章 正则表达式的概念正则表达式(regular expression),在perl中经常被称为模式(pattern),是与一个给定字符串匹配或不匹配的模版。不要把正则表达式和被称为glod的shell的文件名匹配模式混淆。比如*.pm匹配以.pm结尾的文件名。使用简单的模式要比较一个模式和$_的内容,只需把模式放在一对斜杠之间,如下:$_ = aabbkdkdk;if ( /aabb/ ) print it matched!n; ;关于元字符在正则表达式中有一组具有特殊意义的字符,叫元字符,如:.号匹配任意单个字符(但不匹配换行符),加反斜杠会使它不再特殊。一对反斜杠配置一个真正的反斜杠。简单的数量符在模式中重复一些东西。*号匹配前面的条目0次或多次。如:/foot*test/匹配在foo和test间任意数目的制表符。.* 匹配任意字符、任意次数。+ 匹配前面的条目一次或多次。? 匹配前面的条目是可选的,只能发生一次或0次(即没有)。模式中的分组可以用()括号分组,所以小括号也是元字符。如:/abc+/ 匹配abccccccccccccccccc/(abc)+/ 匹配abcabcabcabcabc/(abc)*/ 匹配任意字符串,甚至是空串。选择竖线 | 表示要么是左侧匹配,要么是右侧匹配。此时读做“或”。/aa|bb|cc|/ 匹配一个含有aa或bb或cc的字符串。/aa( |t)+bb/ 匹配aa和bb中间被空格、制表符或两者的混合串分隔/aa( +|t+)bb/ 匹配aa和bb中间必须全是空格,或全是制表符/aa(and|or)bb/ 匹配aa and bb 和aa or bb一个模式测试程序下面这个程序有助于在一些字符串上测试一个模式,看看它匹配了什么,在哪里匹配的。#!/usr/bin/perlwhile () chomp; if (/your_pattern_goes_here/) print Matched : |$|n; else print No match.n; ;第八章 正则表达式提高字符类字符类(character class)即在一对中括号中列出的所有字符,可以匹配类中的任何单个字符。例如:abcdefg可以匹配这七个字符中的任何一个。可用“-”指定一个范围。如a-h,1-9等。001-177匹配任何7比特ASCII码。中括号中的“”号是取反的意思,如abc匹配除abc外的任何单个字符。字符类快捷方式有些字符类的使用特别频繁,所以就有了快捷方式。如:所有数字的字符类0-9可以缩写成d,A-Za-z0-9_缩写成w。s匹配空白,它和ftnr 等同,即等同一个含五种空白字符的字符类,它们是换页符,制表符,换行符,回车符和空格字符自已。s只匹配类中的一个字符,所以一般用s*匹配任意数量的空白(包括没有空白),或用s+匹配一个或多个空白字符。以上快捷方式的反置写法是用大写形式表示,D,W,S。/dA-Fa-f/匹配十六进制数字。/dD/匹配任何数字或任何非数字,也就是任何字符,包括换行符。“.”匹配除换行符外的所有字符。/dD/表示什么都不匹配。通用数量符前面我们见过三个数量符*,+,?。但如果这三个不能满足你的需要,也可以用大括号中的一对由逗号隔开的数字来指定重复的最少和最多次数。如/a5,15/匹配重复5次到15次的字母a。如果省略第二个数(但包含逗号),那么匹配的次数就没有上限。如/a3,/就匹配一行中连续出现的3个或多个a,它没有上限。如果连逗号也没有了,那么给出的数字就是一个准确的数字。如/a3/匹配3个a。 * 等价 0,+ 等价 1,? 等价 0,1锚位符锚位符(anchor)可以用来为模式指定字符串的特定位置。“”标志字符串的开头,“$”标志字符串的结尾。如/a/匹配处于字符头的abc,不能匹配dda,/b$/匹配处于字符尾的aab,不能匹配abc。/s*$/匹配一个空行/abc$/匹配abc,又匹配abcn单词锚位符b可以匹配一个单词的两端,可以用/babcb/来匹配单词abc。可以用一个单词锚位符,如,/bth/可以匹配this,these,但不匹配method。/erb/匹配hander,woner,但不匹配gerenic,lery.非单词边界锚位符是B,它匹配任何b不匹配的地方。如/bsearchB/会匹配searches,searching and searched.但不能匹配search or researching。记忆的小括号()可以用来把模式的一些部份组合起来,它还有第二个功能,它们要求正则表达式引擎记住与小括号中的模式匹配的那部份子串。反向引用反向引用(backreference)就是回头引用在当前模式处理过程中保存的记忆。用一个么斜杠来构成,如1包含第一个正则表达式记忆。即被第一对小括号匹配的字符串部份。反向引用被用来匹配与模式在前面匹配的字符串完全一样的字符串。所以/(.)1/匹配任意单个字符,在记忆1中记住它,然后再与记忆1匹配。换句话说,它匹配任意字符,后跟同一个字符。这样,这个模式会匹配双字母式的字符串。如bamm-bamm和betty。它和/./不一样,/./匹配任意字符,后跟任意字符,它们两个可以一样,也可以不一样。记忆变量正则表达式记忆的内容在模式匹配结束后仍可通过特殊变量$1得到。优先级分四个级别1、最上面的是小括号。2、是数量符,*,+,?,1,2,1,13、是锚位符和序列,$,b,B。4、是坚线 | 。优先级例子/aaa|bbb$/可能不程序员的意思,它只匹配字符串aaa的开头或字符串bbb的未尾。程序员更可能想要的是/(aaa|bbb)$/,它匹配一行中没有其它东西,除了aaa或bbb以外。第九章 使用正则表达式使用m/进行匹配一对斜杠实际上是m/(模式匹配)操作符的一个快捷方式。如我们在qw/中所中,你可以选择任何定界符对把内容括住。如m,m(aaa),maaa,maaa,m!aaa!等。如果选择了反斜杠,就可以省略m。选项修饰符用/i进行不区分大小写的匹配。用/s进行任何字符的匹配,包括换行符。它把模式中的每个点变成和字符类dD一样,匹配任何字符,包括换行符。可组合使用修饰符/is,顺序并不重要。绑定操作符=my $some_other = I dream of betty rubble;if ($some_other = /brub/) print Aye,theres the rub.n; 看起来像个赋值语句,但它不是的。它是说“这个模式缺省时匹配$_中的东西-但现在让它匹配左侧的字符串”。如果没有绑定操作符,表达式就缺省使用$_。匹配变量可以用$1,$2,$3,$4引用正则表达式记忆的第一到第四个记忆。匹配变量是正则表达式强大功能的一个重要部份,它能让我们取出一个字符串的一部份。$_ = hello there,neighbor;if (/s(w+),/) 记住空格和逗号之间的单词 print the word was $1n.; $1 就是 there 匹配变量可以是空串。记忆的持久性匹配变量一般保留到下一次模式匹配成功。也就是除非匹配成功,否则你不应该使用这些匹配变量。自动匹配变量$& 实际与模式匹配的那部份字符串就保存在这里。if (hello there, neighbor = /s(w+),/) print that actually matched $&.n; 整个匹配部份是 there,(一个空格,there,一个逗号),$1中是there,而$&中是整个匹配部份。匹配部份之前的东西被存在$,之后的东西被存在$。也就是说,$含有正则表达式引擎在找到匹配之前需跳过的部份,而$则含有模式没有到达的字符串的剩余部份。如果把这三个字符串按顺序连在一起,那么你总会得到原字符串。第七章的模式测试程序就是使用了这三个神秘代码。print match:|$|n使用自动匹配变量的代价是,会使用其它正则表达式的运行会变得慢一些。所以很多perl程序员都尽量避免使用这些自动匹配变量。相反,他们会采用一些方法,例如,如果你只需要$&,那就在整个模式的周围加一对括号,然后使用$1。用s/进行查换并替换$_ = hes out bowling with barney tonight.;s/barney/killer; 用killer替换barney,如果匹配失败,什么也不会发生。print $_n;s/有一个返回值,替换成功,则为真,否则为假。用/g进行全局替换s/只替换一处,/g修饰符告诉s/进行所有可能的无交迭替换。全局替换的一个相当常见的使用是压缩空白,把任意数量的空白变成一个空格。s/s+/ /g; 压缩空白s/s+/; 把前面的空白删除s/s+$/; 把结尾的空白删除s/也可用不同的定界符,如#,!号等,但如果使用成对的字符,因为它有左右之分,所以必须用两对,一结放模式,一对放替换串,如saaabbb,s(aaa)(bbb),甚至也可以用s(bbb)这样不成对的定界符。s/也和m/一样,有/i,/s修饰符和=绑定操作符。$file_name = s/.*/s; 在$file_name中,去掉所有unix风格的路径。大小写转换U 强制后面的字符都用大写 s/(aaa|bbb)/U$1/gi AAA BBBL 强制后面的字符都用小写 s/(aaa|BBB)/L$1/gi aaa bbb用E关闭,当写成小写形式时,u,l就只影响下一个字符。uL或Lu 代表首字符大写,与顺序无关。split操作符它把一个字符串按照分割子(separator)分开。fields = split /:/,abc:def:a:b; 得到(abc,def,a,b)。fields = split /:/,:a:b:c:; 得到(,a,b,c),结尾空字段被丢弃。在空白处分割也是常见的,使用/s+/模式。 split的缺省行为是在空白处分割$_。如my fields = split; 等同于split /s+/, $_;join函数在某种意义上,join完成split的相反过程。它把一组片断粘合起来形成一个字符串。my $a = join :,1,2,3,4,5; 则$a 是1:2:3:4:5join可以和split配合使用,把一个字符串分割后用不同的定界符恢复它。如可以把1,2,3 变成 1-2-3.第十章 更多的控制结构unless控制结构if是表达式为真时执行,如果希望表达式为假时执行可用unless(除非)。表示除非表达式为真,否则运行这个代码。它就像一个具有相反条件的if语句,也可以理解成一个独立的else子句。unless ($aa = /A-Z_w*$/i) print the value of $aa doesnt look like a perl identifier name.n; 等同于if ($aa = /A-Z_w*$/i) else print the value of $aa doesnt look like a perl identifier name.n; 等同于if (!$aa = /A-Z_w*$/i) print the value of $aa doesnt look like a perl identifier name.n; 以上语句都被编译成相同的内部字节码,但unless最自然。unless的else子句unless ($aa =/(bb)/) print this value like bb.n; else print do you see whats going on here?n; 等同于if ($aa =/(bb)/) print do you see whats going on here?n; else print this value like bb.n; until控制结构while的反置结构。until ($a $b) $a *= 2; 这个循环一直执行,直到条件表达式返回真为止。表达式修饰符print $n is a negative number.n if $n 0;等同于if ($n 0) print $n is a negative number.n; 前一种写法更紧凑。读起来很像自然英语。还有:print ,($n +=2) while $n $j;&greet($_) foreach person;裸块控制块所谓的“裸(naked)块”,指的是没有关键字或条件的块。如:while (condition) body; body; body; 现在把while关键字和条件去掉,就得到一个裸块。body;body;body;它只执行一次,然后就结束,其中一个作用是提供一个临时词法变量的作用域。一条通用的原则,所有变量就应该在最小的作用域中声明。如果你需要一个只用在几行代码中的变量,那么你可以把这些行放在裸块中,并在该块中声明这个变量。elsif子句如果你需要检查一组条件,一个接一个,看看哪个条件为真,就可以用elsif子句(注意不是elseif)。perl会逐个测试条件表达式,当一个条件成功就执行相应的代码。但如果测试项太多,就不要使用这种方式,应该用类“case or switch”的语句。自递增和自递减+ $a+; $a值不变。 +$a; 把$a增1,存到$a里。- $a-; $a值不变。 -$a; 把$a减1,存在$a里。for控制结构for ($i =1 ;$i =10;$i+) print I can count to $i!.n; for ($_ = aaabbbccc;s/(.)/; ) 当s/成功时执行循环。 print one character is :$1n. 每次迭代时都会去掉一个字母。当字符串为空时,替换失败,循环结束。以下用for实现的无限循环for (;) print this is an infinite loop.n; 以下为用while实现的无限循环,一种更具perl特色的写法。while (1) print this is an infinit
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 直播电商2025年主播与品牌合作模式创新策略与风险防控
- 2025-2030年全球新能源产业海外投资案例分析报告
- 机关工会活动策划方案范文
- 熊皮人阅读测试题及答案
- 教育测评考试试题及答案
- 南通会议考试试题及答案
- 2025年电商知识产权保护与知识产权保护法律风险评价报告
- DB65T 4498-2022 高压气地下储气井定期检验规则
- DB65T 4415-2021 机采棉田土壤封闭除草技术规范
- 唱歌 爸爸妈妈听我说说课稿-2025-2026学年小学音乐西师大版三年级下册-西师大版
- T/CCOA 52-2023富硒小麦粉
- 2025年护士执业资格考试题库(社区护理学专项)护理法律法规知识试题卷
- 老人就餐免责协议书
- 班组长安全管理职责
- 应聘家教兼职简历
- 慢阻肺的健康教育讲座
- 光伏电站安全风险辨识及风险库管理制度
- 铁路机车防火安全教育
- 企业内训师培养与培训课程设计
- 网架防腐刷漆施工方案
- 《采矿方法的选择案例综述》1700字
评论
0/150
提交评论