我的评价:本书是perl的经典入门书籍,介绍了perl中最基本的概念和语法,是perl入门的好书,我向所有想了解或学习perl语言的朋友推荐本书。书中穿插有perl语法形成的历史和原因,使你能充分感受到perl语言的文化,这也是perl流行的原动力。本书行文流畅,各知识点介绍到位,令人很容易明白,达到入门点睛的效果。但本书的作用也就是入门而已,目的很明确,它没有深入到perl脚本语言的高级部份。如果你想了解perl的高级功能或使用perl来更好地完成你的日常工作,还需进一步学习,《perl语言编程》应该是你最好的选择。第一章简介第二章标量数据什么是村量数据?标量(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响铃\eEsc(ascii的转义字符)\007任意ASCII码的八进制值(这里007=响铃)\x7f任意ASCII码的十六进制值(这里07f=删除)\cC任意Ctrl键组合字符(这里是Ctrl-C)\\反斜杠\双引号\l下一个字母小写\L所有后面的字母小写,直到\E\u下一个字母大写\U所有后面的字母大写,直到\E\Q添加反斜杠引用后面的非单词字符,直到\E\E结束\L,\U,\Q字符串操作符.连接两个字符串hello.world=helloworldx串重复操作符yangx3=yangyangyang次数使用前截成一个整数。4.8=4,小于1的拷贝次数会得到一个空串。数字与字符串的自动转换依赖于作用在标量值上的操作符。如果是+则是数据,如果是.则是字符串。z.6*7=z42,12*3=36perl的内置警告可以要求perl在发现你程序有异常时给你一个警告。使用-w选项。#!/usr/bin/perl-w标量变量变量(variable)是一个容器的名字,用以存放一个或多个值,变量的名字在程序中保护不变,但它所包含的值在执行过程中一般要不停地改变。在perl中用美元符号标识。$a,$test。选择好的变量名适当加一些下划线可让变量更易读,更易理解。标量赋值(assignment)操作符用等号,它的左边是变量名,右边是值。二元赋值操作符+=-=*=.=**=andsoon用print输出printhelloworld\n;printtheanswer,6*6,.\n;在字符串中替换标量变量$meal=brontosaurussteak;$barney=fredatea$meal;另一种写法$barney='fredatea'.$meal;如果标量变量从未被赋过值,就用一个空串替换。操作符优先级和结合性善用小括号perlk中的操作符优先级和结合性与C一样比较操作符相等==eq不相等!=ne小于lt大于gt小于等于=le大于等于=geif控制结构if(){...;}else{...;}布尔值perl中没有单独的的布尔数据类型,不过,它使用几条简单的规则。1、特殊值undef是假。2、0是假,所有其它的数字是真。3、空串''是假,所有其它的字符串一般是真。4、一个例外,因为数字和字符是等价的,所以0的字符形式'0',和它的数值形式有同样的值:假。!是取反的意思,可以在真值前加,结果就变成了假。取得用户输入STDIN从键盘得到一个值。一般以\n字符结束。所以可利用该字符做条件控制。chomp操作符它作用于一个变量,此变量必须存放一个字符串,如果这个字符串以换行符结尾,chomp就把它去掉。$text=alineoftext\n;chomp($text);去掉换行符chomp($text=STDIN);最常用的方法,读文本,不带换行符chomp是一个函数,所有它有返回值,即去掉的字符个数。使用chomp时可以带或不带小括号,这是perl的另一个基本规则,除非去掉括号会改变意思,否则括号总是可有可无的。while控制结构重复执行一个代码块,只要条件为真。$count=0;while($count10){$count+=1;printcountisnow$count\n;得到从1到10的值。}undef值变量在第一次赋值之前有特别的undef值,代表什么也没有。当把它作为字符串时,其功能相当于一个空串。当把它作为数字时,其功能相当于0。perl程序员经常这样使用。很多操作符在操作数超出范围或没有意义时会返回undef值,这样一般不是什么问题,但如果打开perl的警告,则会导至一个警告。defined函数测试一个值是undef还是非空字符串,可以使用这个函数。它对undef返回假,其它所有情况则返回真:$madon=STDIN;if(defined($madon){printtheinputwas$madon;}else{printnoinputavailable!\n;}如果你想生成自已的undef值,可以用古怪的undef操作符$madon=undef;好像它从来没有被动过第三章列表和数组在perl中,如果“单数”是标量,那么“复数”则由列表和数组来表示。列表(list)是一个有序的标量集合,数组(array)是一个包含列表的变量。精确地说,列表是数据,而数组是变量,可以有一个不在数组的列表,但每个数组变量都包含一个列表。数组和列表可以放任意多的元素,最小的是没有元素,而最大的可以把所有内存耗尽。这符合perl的“没有不必要的限制”哲学。访问数组的元素数组元素用连续的整数编号,从0开始,然后按1递增。$fred[0]=a;$fred[1]=b;$fred[2]=c;如果下标所指的元素超出了数组的区间,那么相应的值就是undef。特殊的数组索引如果你试图存储一个超出数组区间的数组元素,这个数组就会自动按需扩展,对它的长度没有限制,只要有足够的内存供perl使用。$rocks[0]=a;$rocks[1]=b;$rocks[2]=c;$rocks[10]=end;现在就有6个undef元素。访问最后一个元素的索引是$#rocks。负的数组索引从数组尾部算起,-1代表最后个元素。列表直接量列表直接量(listliteral)是小括号中的一列由逗号分隔的值。例如:(1,2,3,4)(“fred”,43.4)()(1..100)(0..$#rocks)“..”是区间操作符,能生成一个顺序列表。如上例中的从1到100。列表可包含表达式或变量。qw快捷方式qw表示“被括引的单词”(quotedwords)或“用空白括住”(quotedbywhitespace),perl按单引号字符串处理它们,所以你不能像在双引号字符串中那样在qw列表中用\n或$fred)。qw/abcd/等同于(a,b,c,d)qw!abcd!等同于(a,b,c,d)qw{abcd}等同于(a,b,c,d)定界符可以选择任意的标点。列表赋值($fred,$barney,$dino)=(a,b,c)($fred,$barney)=($barney,$fred)交换它们的值,比c等语言方便很多。如果变量的个数小于值的个数,则多余的值会被无声地忽略。如果变量的个数多于值的个数,则多的变量会得到undef值。at符号@可以一次指定整个数组。这样@rocks代表“所有的rocks”。@rocks=qw/abc/;@copy=@quarry从一个数组拷贝一个列表到另一个数组popandpush操作符正真的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/123/;push@array,@others@array现在有(5,6,7,0,1,2,3)注意:push的第一个参数或pop的唯一参数必须是一个数组变量,进栈和出栈对直接量列表来说是没有意义的。shiftandunshift操作类似于pushandpop,shiftandunshift对数组的头部进行相应的操作。在字符串中替换数组与标量一样,数组的值也可以被替换到双引号字符串中。printquartz@rockslimestone\n;打印所有岩石,用空格分开。注意:不要把电子邮件地址放到双引号字符串中。foreach控制结构foreach循环遍历列表中的所有值,对每个值执行一个迭代(执行一次循环体)foreach$rocks(qw/abc/){printonerockis$rocks.\n;打印abc。}Perl最喜欢的缺省变量:$_如果你在foreach循环的开始忽略了控制变量,perl就会使用$_。foreach(1..10){缺省使用$_printIcancountto$_!\n;}$_=a;print;缺省打印$_reverse操作符reverse取一个列表的值,然后返回相反顺序的列表。记住它只返回反序列表,并不影响它的参数,如果返回值不被赋给别的变量,它是不保存。sort操作符sort取一个列表的值,然后按照内部字符序进行排序。标量和列表上下文一个给定的表达式在不同的地方,可能会有不同的含义。5+somethingsomething必须是个标量sortsomethingsomething必须是个列表在标量上下文中使用列表生成表达式提供标量上下文的表达式:$fred=something;$fred[3]=something;123+somethingsomething+654;if(something){...}while(something){...}$fred[something]=something;提供列表上下文的表达式:@fred=something;($fred,$barney)=something;($fred)=something;push@fred,something;foreach$fred(something){...}sortsomething;reversesomething;printsomething;在列表上下文中使用标量生成表达式如果一个表达式在正常情况下不生成一个列表值,那么自然它就会生成标量值,即一个元素列表:@fred=6*7得到一个单元素列表(42)注意,因为undef是个村标量值,所以给一个数组赋undef并不能清空数组,清空的更好方法是赋一个空列表()。强制使用标量上下文可以使用scalar