本节主要内容:
Learning Perl》学习笔记
第一章 简介
写在前面:
本着读书“由厚变薄,再由薄变厚”的精神,努力整理自己的思绪,将《Learning Perl》的内容浓缩、提取,作了如下的学习笔记。
1.每个Perl语言的开头,都是以类似
2.Perl的注释是从一个井号(#)一直到行尾的内容。
正常的Perl语句以分号(;)结尾;
另外,Perl的书写格式比较自由,允许随意使用无关紧要的空白。
第二章 标量数据
这章介绍了Perl语言中标量数据的概念、应用于标量数据的操作符及if和while两种控制结构。
1.标量(Scalar)数据的概念
在Perl中,单个的数字和单个的字符串都被视为标量数据。
1.1 数字标量
Perl中的数字没有整型、浮点型的区别,在Perl的内部统一用浮点型表示,对于用户来说,感觉不到差别。
八进制直接量以0开头,十六进制以0x开头,二进制以0b开头。
1.2 字符串标量
字符串是字符的序列,字符串中可以包含任意字符的组合。
在Perl中表示字符串有两种方式:单引号字符串和双引号字符串。
字符串是放在单引号'(或双引号")之间的字符序列;
1.2.1 单引号与双引号在字符串标量中的区别
在单引号间,除了单引号和反斜杠以外的任何字符在字符串中表示该字符本身;
在双引号间,则可以使用反斜杠转义字符及变量替换。
所以,若想获得纯粹的字符串,可以使用单引号;若想使用反斜杠转义字符或变量替换,则使用双引号。
1.3 数字与字符串的转换
数字转换为字符串:直接在数字上加上单引号或双引号即可,譬如把数字37变成字符串,37-->"37"。
字符串转换为数字:直接去掉单引号或双引号,并去掉非数字字符,如第一个字符不是数字,则转换后,该数字为0。
譬如"37jerry"转换为数字后,变成37;"jerry"转换为数字后,变成0。
1.4 标量变量
标量变量以$开头。
在Perl中,变量在第一次赋值前有特别的undef值,这个值对于数字来说,相当于0;对于字符串来说,相当于空串。
所以在Perl中,相当于对定义的变量已经进行了初始化,不必担心由于未初始化而出现的一些错误。
2.操作符
2.1 数值操作符
包括常规的+,-,*,/,%(求模),**(求幂)等操作符。
2.2 字符串操作符
字符串可以用.操作符连接起来。
串重复操作符x(小写字母x):这个操作符取它左边的操作数(一个字符串),生成连续的拷贝,重复次数由它右边的
操作数(一个数字)决定。譬如,"fred"x2="fredfred";
2.3 二元赋值运算符
和C语言类似,Perl中有二元赋值运算符,譬如+=,*=等。
2.4 比较操作符
3.控制结构
3.1 if控制结构
3.1.1 if控制结构中条件判断的真假问题(布尔值)
几条规则:
特殊值undef是假;
0是假,其它的数字全为真;
空串('')是假,其它的字符串一般是真;
一个例外:因为数字和字符串是等价的,所以0的字符串形式,'0',和它的数值形式有同样的值:假。
这点是和C语言有区别的地方。
总结:标量值为undef,0,'',或'0'时,为假;所有其它的标量都为真。
3.2 while控制结构
4.有用的函数
4.1 取得用户输入
使用行输入操作符:$line = ;
$line是自己定义的标量变量,Perl以换行符判断一个行输入的结束,同时换行符也会存储在变量$line中。
4.2 chomp操作符
这涉及到Perl的一个基本规则:除非去掉括号会改变意思,否则括号总是可有可无的!!!
4.3 defined函数
用于判断一个变量是undef还是非空字符串,可以使用defined函数,它对undef返回假,其它所有情况返回真。
第三章 列表和数组
本章讲述了列表和数组的概念、针对列表和数组的一些运算符和函数,并着重阐明了Perl中重要的“上下文”的概念。
1.列表和数组的概念
列表(list):是一个有序的标量集合;
数组(array):是一个包含列表的变量。
因此,简单地说,列表是数据,而数组是变量。
在Perl中不需要事先定义数组的大小,数组的大小总是可以根据需要自动扩展和收缩,没有被赋值或预定义的数组元素其值为undef。
1.1 访问数组及数组元素
对整个数组的访问很简单,在数组名前面加上@符号即表示整个数组,如@array。
使用索引访问数组元素,索引从0开始,逐渐递增,和C语言相同。
譬如数组名为array,则访问数组元素的方式为:$array[index]。
一个数组的最后一个元素的索引值为$#array(array为该数组名)。
Perl中还提供了一种从数组尾部访问数组元素的快捷方式:
负的数组索引从数组的尾部算起。
譬如,$array[-1]表示array数组的最后一个元素。
1.2 命名空间的概念
在Perl中,标量、数组和后面章节将要讲的散列的变量名是在不同的命名空间,
你可以在同一个程序中定义一个名为Jerry的标量,
名为Jerry的数组和名为Jerry的散列,而Perl不会讲它们搞混,因为它们本来就没在一个命名空间。
要记住的是访问类型的变量,需要使用不同的前缀,可以认为前缀是命名空间的名字。
2.针对列表和数组的运算符和函数
2.1 ".."运算符
".."运算符表示一个区间,譬如1..5,表示从1到5的五个数字(1 2 3 4 5),一般用于列表或数组的赋值中。
2.2 qw快捷方式
qw表示“被括引的单词(quoted words)”,用于将一些字符序列赋值给列表或数组。
譬如要将fred, barney, betty,wilma和dino赋值给数组array,如果不用qw快捷方式,
则需@array = ("fred", "barney", "betty", "wilma", "dino");这样需要键入大量的双引号。
如果使用qw,则为@array = qw /fred barney betty wilma dino /;
注意qw快捷方式后面使用的分隔符是任意的,可以使用//,也可以使用!!或<>等,只要这两个匹配即可。
2.3 pop和push操作符
这两个操作符将数组当作堆栈来处理,pop用于从数组中弹出一个数据,push用于向数组中压入一个数据,针对的都是数组的尾部。
语法:
2.4 shift和unshift操作符
这两个操作符的功能和pop与push类似,只是它们针对的是数组的头部进行操作。
语法:
2.5 foreach控制结构
这个控制结构用于遍历整个数组,语法为:
注意:
在遍历数组时,$var不是数组元素的拷贝,它就是数组元素本身,因此在{}中改变$var将改变array数组本身。
但是,在遍历结束后,$var将恢复遍历数组前的值,即如果遍历数组前,$=10,则遍历完成后,$var仍然等于10。
2.6 reverse操作符
reverse操作符取一个列表的值(可以是来自一个数组),然后返回相反顺序的列表。
记住reverse只是返回反序列表,它并不影响它的参数。
因此,如果返回值不被赋给别的变量,它就毫无用处。
语法:@var = reverse @array;
2.7 sort操作符
sort操作符取一个列表的值(可以是来自一个数组),然后按照内部字符序进行排序。
对ASCII字符串,就是按照ASCII字母表的顺序。sort和reverse相同,不影响它的参数,
因此,你必须把你要的结果赋给别的变量。
3. 上下文的概念
上下文指的是一个表达式是在哪里出现的。
它实际上就是一个简单的思想:
一个给定的表达式在不同的地方,可能会有不同的含义。
当Perl解析你的表达式时,它总是期望一个标量值或一个列表值或一个其它的值。
Perl的期望就被称作表达式的上下文。对Perl中具体上下文的认识需要在实践中逐步领会。
譬如:
有意思的现象:
当把一个数组赋值给一个标量时,这个标量获得这个数组的元素的个数,$var = @array;
有时需要强制使用标量上下文,这时可使用一个假函数scalar通知Perl,这里需要一个标量上下文。如scarlar @array;
在列表上下文中,从<STDIN>获得的数据存储在一个数组中,每行为一个数组元素。@lines = <STDIN>; #在列表上下文中读取标准输入