perl编程入门学习笔记《Learning Perl》学习笔记

发布时间:2020-03-08编辑:脚本学堂
本文详细介绍了,有关《perl编程入门》这本书的学习笔记,如果你参照本文的提纲性笔记去学习《Learning Perl》,相信会进步很快的,有兴趣吗?快来看看吧。

本节主要内容:
Learning Perl》学习笔记

第一章 简介

写在前面:
本着读书“由厚变薄,再由薄变厚”的精神,努力整理自己的思绪,将《Learning Perl》的内容浓缩、提取,作了如下的学习笔记。

1.每个Perl语言的开头,都是以类似
 

#! /usr/bin/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 比较操作符
 

比较数字:<, <=, ==, >=, >, !=。
比较字符串:lt,le,eq,ge,gt,ne(含义和上面的数字比较符对应)。

3.控制结构
3.1 if控制结构
 

if () {};
if () {}; else {};
 

3.1.1 if控制结构中条件判断的真假问题(布尔值)
几条规则:
特殊值undef是假;
0是假,其它的数字全为真;
空串('')是假,其它的字符串一般是真;

一个例外:因为数字和字符串是等价的,所以0的字符串形式,'0',和它的数值形式有同样的值:假。
这点是和C语言有区别的地方。
总结:标量值为undef,0,'',或'0'时,为假;所有其它的标量都为真。
3.2 while控制结构
 

while(){};

4.有用的函数
4.1 取得用户输入
使用行输入操作符:$line = ;
$line是自己定义的标量变量,Perl以换行符判断一个行输入的结束,同时换行符也会存储在变量$line中。
4.2 chomp操作符
 

chomp作用于字符串,用于去掉字符串结尾的换行符且只能去掉一个,如果该字符串末尾不是换行符,则chomp什么也不做。
chomp($line);
chomp $line; #也可以

这涉及到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用于向数组中压入一个数据,针对的都是数组的尾部。
语法:

$var = pop @array; push @array, $var;

2.4 shift和unshift操作符
这两个操作符的功能和pop与push类似,只是它们针对的是数组的头部进行操作。
语法:

$var = shift @array; unshift @array, $var;

2.5 foreach控制结构
这个控制结构用于遍历整个数组,语法为:
 

foreach $var (@array) {};

注意:
在遍历数组时,$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中具体上下文的认识需要在实践中逐步领会。

譬如:
 

复制代码 代码示例:
5 + something; # something必须是个标量
sort something; # something必须是个列表

有意思的现象:
当把一个数组赋值给一个标量时,这个标量获得这个数组的元素的个数,$var = @array;

有时需要强制使用标量上下文,这时可使用一个假函数scalar通知Perl,这里需要一个标量上下文。如scarlar @array;

在列表上下文中,从<STDIN>获得的数据存储在一个数组中,每行为一个数组元素。@lines = <STDIN>; #在列表上下文中读取标准输入

 1/4    1 2 3 4 下一页 尾页