微智科技网
您的当前位置:首页Perl 学习笔记(免费)

Perl 学习笔记(免费)

来源:微智科技网
1. 获取用户输入:

2. chomp操作符作用:去除字符串后面的换行符

3. 注释: # 注释

4. 数组的最后一个值的索引:在变量中加一个#

所以数组的个数就是 $#rock + 1 5. 列表赋值

6. 创建数组: @name

引用的时候:$name[]

数组的赋值:

7. 数组尾部操作: Push和pop 数组头部操作:

Unshift(插入)和shift(取出)

8. splice操作符可以对数组中的任意位置进行插入和删除操作。它可以接受4个变量

第一个变量是数组名,第二个变量是起始索引,第三变量是长度,第四个变量是补充数组。 二个参数:删除后面全部

三个参数,设定删除的长度:

四个参数:设定插入的东西

9. 标量内插到字符串中:

数组也可以内插到字符串中,在内插过程中,会添加空格

10. foreach使用默认值,不使用变量:

11. reverse操作符:用于将次序变反

12. sort操作符用于对数组进行排序

13. 对数组使用each操作符:

Each可以用于提取哈希的键值,这样也同时可以提取数组的序号和数值。

use 5.012;这样写主要是想用 say 如果不用each,需要实现的过程如下:

14. 上下文:

所谓上下文就是返回的值是根据需要进行返回的。

15清空数组:

15. 子程序

定义:sub name {};

调用子程序:&+子程序名

如果我们不写return,照样可以返回,主要是这样写除了返回,没有任何意义。

如果没有明显返回值,就是返回1

传递参数:

在子程序调用的时候,可以直接写参数,系统会自动将自动将参数保存到$_[]数组中,然后在子程序中可以直接调用$_[0],$_[1]来获得参数。

16. 子程序的私有变量 My +定义私有变量

用my定义的私有变量可以用在很多地方,比如在for循环中的i我们就可以定义为局部私有变量。

17. use strict可以使的Perl更加严格

这不报错,但

这就报错,报出的错误是:

也就是说不能轻易的用全局变量,应该像上面那样用my修饰,或者是因为你写错了,应该用上面那个已经定义过的变量。

18. 持久性私有变量:用state修饰

用state定义的私有变量,在每次调用这个子程序时,只调用一次定义的语句。 19. 数据输入: 方法一:用while

方法二:用foreach

Windos下按Ctrl+z结束输入

我们会发现,两种输入方法完全不同,下面一种将会占用空间。 20. 钻石输入:<>

就是用<>来代替以前那个,就是一直获取输入,直到空

如果我们没有给ARGV数组赋值的话,就从命令行读入,如果赋值的话,就从ARGV中指定的文件中读取数据。

利用钻石操作符可以获取文件中的数据,实际的文件调用顺序是根据内部的一个数组ARGV来的,比如:

21. 利用printf可以格式化输出:

%s,%d等,和C语言的输出是一样的。

正是前面空,负是后面空

22. 遇到特殊情况结束程序的运行:

23. 文件句柄:

文件句柄是用于进行文件操作的一个变量,如果没有变量代替,我们就没法具体操作。 我们一般把文件句柄的定义全用大写表示。

open READANDWRITE,'canreadandwrite.txt'; #以读写方式打开(已经存在的文件) open READTXT,'<','canreaadfile.txt';#以只读方式打开(已经存在的文件) open WRITETXT,'>','canwritefile.txt';#新建一个新的文件并写东西 open ADDWRITE,'>>','addwrite.txt';#以追加的形式写,如果文件存在,就追加,如果不存在,就创建

打开用完之后,就尽快关闭: closeREADANDWRITE; closeREADTXT; closeWRITETXT; closeADDWRITE; 使用文件句柄: 读取文件信息:

24. 哈希表

注意上面是花括号

要指代整个哈希,可以用%作为前缀。

哈希只能通过键获取值,不能通过值获取键,就如同数组中只能由索引获得数组值一样,但哈希可

以通过reverse来把键值调换:

我感觉这样我们就可以通过值获得键了,因为值经过反转之后变成了键了。 但是这种反转必须在值都是不一样的情况下才能使用,否则会出错。 为了方便阅读,我们可以利用=>来直接进行键值的一一对应。 my%student= (

'name'=>'zhulei', 'age'=>23, 'id'=>15,

'sex'=>'male', );

Keys函数可以返回哈希表的全部键值,而values函数可以返回哈希表的全部值列表。

Each函数用于哈希中(只能用于while中)

通过foreach遍历哈希表

Exists函数,可以用于检验哈希表中是否有某个键:

Delete函数可以从哈希中删除指定的键及相对应的值,假如没有这个键,它就会直接结束,而不会出现任何警告或错误信息。

可以把单一元素内插到字符串中,但不能把全部的哈希表插入到字符串中。

25. 获得环境配置Path

正则表达式:

1. 正则表达式书写://或m()如果有m就一对是什么都可以的。 2. 简单模式://

我们也可以这样写:

正则表达式是默认搜索变量$_,上面那种方式是我们把那个绑定到了我们定义的变量了。 3. 如果我们要查询匹配某项属性,就可以在正则表达式中写\\p{属性名}

属性名可以是Space:表示有空格,Digit:表示有数字,还有一些其他的属性。

4. 元字符:

1) 点号(.)能匹配任意一个字符的通配符(是一个,并且不包含换行符(‚\\n‛)); 如果是要匹配点号,就需要用\\.才能真正取得点号。

2) 星号(*)匹配它前面的那个东西0次或多次。 3) 加号(+)匹配前面的东西1次以上

4) 问号(?)表示前一个条目是可有可无的

5. 模式分组:圆括号(()):作用是对字符串进行分组,我们可以利用反向应用来引用第几个括号中

的模式所匹配的文字。比如/()()\\1\\2/其中\\1代表前一个括号,\\2代表后一个括号。

我们用\\1这样书写来进行引用,就担心会出现和后面有重复,比如\\11是指第十一个括号还是指第一个括号加1呢?

所以这里就用另一种写法:\\g{1}这样就很明确了。

我们用\\g{正数}代表的是从左边起第i个括号,如果我们写负数,就相当于从右边数起的第i个。

5) 这一匹配(|)就是要么左边匹配,要么右边匹配,所以fred|barney|betty的意思就是能匹配

任何含有fred或barney或betty的字符串。

/fred(|\)+barney/的意思是,fread后面加一个括号,括号中有空格和\(制表符)的或运算,然后后面有一个+,+的意思是一个或多个,所以这个正则表达式的意思是:fred和barney中有一个或多个空格或制表符或两者的混合。

6) 字符集[]:指一组可能出现的字符,通过[]内表示,它只匹配其中的单个字符,可以是其中列

出的任何一个。比如[a c d I k]只要有其中的任意一个就可以了。 为了方便书写,我们可以这样写[a-c w-z] 代表有a b c w y z

如果我们要取上面的除了a-c其他都可以,那么就用^:[^a-c]就可以了

字符集的简写,比如我们要取任意数字都可以,那么我们就直接写:\\d就可以了。

其实\\d我们是想让他等同于[0-9],但同时他还可以匹配一下阿拉伯数字,所以和我们的要求有点

出入,如果我们只要在//后面写一个修饰符a就可以了,这样写://a,a写在最后,是修饰符,这是其中一个,还有很多其他的修饰符。

7) 匹配空白符(\\s):效果和我们利用\\p{属性名}中的\\p{space}一样的。 空白符包括:空格,换页符,水平制表符,换行符和回车符 所以\\s等同于[\\f\\\n\\r]的字符集

当然了,在新版的perl中,\\s还可以匹配其他一些特殊的字符,所以我们要想实现我们想要的效果,就需要在正则表达式后面加 a作为修饰符

8)匹配单词(\\w):匹配这样一组字符:[a-zA-Z 0-9]

9)反义简写,比如我们要匹配数字,我们可以用 [\\d],如果我们想要匹配的是不是数字,就可以用这样[^\\d],为了简化,我们用大写代表反义,也就是说[^\\d]==[\\D] 大写的还有\\S,\\W

6. 我们进行正则表达式是:如果写成这样://就不需要前面写m了,如果用其他方式进行包围,

就需要前面写m,比如:m##,m%%,m(),m{}等都可以。

比如如果http://如果用//进行界定的话,就需要写成:/http:\\/\\//这样看起来不直观,所以我们可以这样写:m%http://%就看起来好多了。

7.我们在上面提到了一个修饰符 a,主要是用于修饰使得进行严格匹配,不需要匹配阿拉伯之类的东西。现在我们还有其他修饰符,也都是写着模式的界定后面的://i代表进行大小写无关的匹配。 //s:默认情况下,点号(.)无法匹配换行符,其他都可以匹配,现在我们后面加了s作为修饰符后,点号就可以匹配包括换行符内的任意字符了。

我们发现,加了s作为修饰符后就匹配了。

//x是可以运行我们在模式中加入空格,这样我们读起来可能更轻松一些。

如果需要用多个修饰符,就可以直接写在一起,比如//sxa

7. Perl5.14以上有三种字符解释方式:ASCII、Unicode和Locale。我们用//a代表用ASCII

解释,用//u代表用Unicode解释,用//l解释用本地化语言解释。 8. 锚位:锚位的作用就是使得匹配指数在某个位置进行。 比如\\A就是设定只在开头匹配,其他地方不匹配。

如果我们要匹配绝对末尾,就需要用到\\z,其中\\z修饰在最后面,再没有其他东西了。

如果用大写的\\Z,就允许后面出现换行符,而小写的z是不允许的。 如果是匹配空行,可以这样写:m{\\A\\s*\\Z}

匹配后缀结尾的:m{\\.png\\Z}是代表以.png结尾的输入。 修饰符//m代表可以匹配多行。

如果是有多行,并对行末尾进行匹配,就可以用/$/m

$是锚位,用于定点在行最后,m是修饰符,用于修饰可以匹配多行。

锚位并不局限于字符串首尾,还有可以是单词边界:\\b它匹配任何单词的首尾。 M{\\bfred\\b}就是只能匹配fred,其他都不行 M{\\bfred}单词必须是首部匹配, M{fred\\m}单词必须是尾部匹配。

这里的单词是又\\w集合所形成的单词,就是由英文字母、数字和下划线组成的字符串。 如果我们要找的就不是单词的头或尾,就用大写的:\\B

9. 绑定操作符:=~

默认情况下,我们都是用$_,这样我们在匹配的时候,我们匹配寻找的是从$_中寻找,就可以不写,但如果我们要从其他变量中匹配,就需要用绑定操作符。 其实只是替换了$_而已。

10. 模式的内插:

正则表达式内部可以进行双引号的内插: 用括号就可以内插进去:

11. 捕获:圆括号出现的地方一般会触发正则表达式,从而获取匹配到的字符串,我们就可以把这

个铺货取出来。

上面是如果有获得匹配,就输出括号捕获的值,如果没有,就说是不匹配。

上面的正则表达式是先有se然后多个任意字符,加上一个空格再加一个s单词,那么括号捕获的就是fred了。我们可以利用$1 ---- $n来输出对应序号括号里面捕获的值。

注意:捕获变量通常能存到下次成功匹配为止,如果下次成功,就覆盖,下次如果失败,就保留,所以一定要在匹配成功后使用。

所有的圆括号都会捕获变量,如果要想让它不捕获,可以这样写:(?:)就相当于在括号里面的最前方加一个?:这东西。

提示说$2找不到,因为第

一个括号我们屏蔽掉了,所以第二个括号是$1。

我们可以把捕获的东西存到变量中:(?

一旦使用了捕获标签,我们就很方便了。 我们上面提到,可以通过\\1(或\\g{1})来反向引用括号里匹配的字符,我们就可以这样写:\\g{label}来通过标签来反向引用括号里面匹配的字符。

12.三个自动捕获变量:$` $& $’分别代表捕获前,捕获,捕获后。

从上可以看出,在括号捕获前的所有东西都存在$`,括号捕获的信息存在$&中,括号捕获后面的全部存在$’中。

在perl5.10及更高级的版本中,他们的名字分别是:${^PREMATCH} ${^MATCH} ${^POSTMATCH}

12. 量词:量词用作表示前面东西的重复次数。前面有三个量词:*(0次及以上),+(一次及以上),?(0

次或1次)。

如果我们要让出行8-10次,那么可以则有写:/a{8,10}/代表a出现8-10次才满足要求。

如果是/(fred){3,}/这个模式会匹配fred出现三次以上的情况。 /w{8}/代表w正好出现8次。 13. 优先级:

圆括号>量词>锚位和序列(\\A,\\Z,\\z,^,$,\\b和\\B)>择一竖线(|)>原子(字符,字符集,反向引用)。

14. 文字的替换:s/正则模式/需要替换的新的字符/

这个替换是执行一次替换,要想一次性全部替换,就需要用修饰符://g

我们也可以改变S///的界定符,可以是s%%%,S###,s{}{},s<>##,s[][]等。 就是如果要配对的就需要两队,如果不需要配对的,就用三个。 修饰符//I,//s和//x都可以用于这里作为修饰符。

15. 无损替换,就是同时保留原来的和新的,我们就可以先把原始的复制一份,然后再操作,也可

以一步到位:

16. 大小写转换:\\U(大写)转译符会将其后面的全部文字转换长大写。

\\L(大写)会把它后面的全部转换为小写:

我们还可以用\\E关闭大小写转换的功能:

使用小写字母:\\l和\":{"h":18,"w":20.054,"x":221.5,"y":523.908,"z":9},"ps":null,"s":{"letter-spacing":"0.254就只会影响其后的一个字符。

17. 拆分和合并split操作符:按给定的模式拆分字符串 My @fields = split/separator/,$string

默认情况下split会以空格的形式拆分字符串$_

Join函数:与split恰好作用相反,将字符按模式进行组合。 My $result = join $glue,@pieces;

18. 两个模式圆括号捕获可以直接给哈希赋值。

19. 我们为了防止贪婪,在每一个量词后面加一个?。

20. 我们上面写道,如果是多行的,首先是用//m修饰符,然后$代表行尾,^代表行头。 21. Unless控制结构:

Unless(xxx){……} === if(xxx){none} else{………}; Until控制结构: Until() { }

等价于while循环的颠倒,就是while是真才运行,而Until是假才运行。 22.last == break next == continue

Redo:返回循环块顶端,i不增加,而是说这个循环再走一遍。 22. 文件测试操作符及其意义: 操作符 意义 操作符 意义 -r 文件或目录,对目前用户或组可读 -w 文件或目录,对目前用户可写 -x 文件或目录,对目前用户可执行 -o 文件或目录,由目前用户拥有 -R 文件或目录,对实际用户或组可读 -W -X -O -e 文件存在而且没有内容 -s 文件存在而且有内容 -f 普通文件 -d 目录 -l 链接文件 -S Socket类型文件 -p -c -g -t -B -A 设备文件 文件或目录设置了setuid位 文件或目录设置了sticky位 看起来像文本文件 最后一次被修改后至今的天数 最后一次文件节点编号被变更到现在的天数 如果文件不为空,-s会返回表示文件大小的数字,单位是字节。 先入先出队列 字符设备文件 文件或目录设置了setgid位 文件句柄TTY设备 看起来像二进制文件 最后一次被访问至今的天数 -b -u -k -T -M -C 测试同一文件的多项属性: If(-r $file and –w $file) {

…… }

23. 目录操作:一般情况下,我们所操作的文件都是放在和程序相同的目录下的。但这样很不方便,

所以我们可以通过对目录的操作来改变文件的存储位置。

程序运行时会以自己的目录作为工作目录的起点,也就作为相对路径的起点。

文件名通配:

另一种通配:<*>

文件句柄:

目录句柄:

删除文件:unlink

重命名文件:

Rename ‘old’,’new’

另一种重命名方式:rename‘old’ =>‘new’

创建目录:

Mkdir‘foldername’:

删除目录:rmdir‘foldername’

如果文件夹里面有文件,就会删除文件夹失败,必须先把文件夹里面的文件全都删除,再删除文件夹:

字符串操作:

1. 用index查找子字符串首次出现的地方。 $where = index($big,$small);

2. 我们可以设定不从起始位置0来说寻找,而是从某一个索引值处开始寻找: $where = index($big,$small,$num); 如果找不到,会返回 -1

3. 如果要搜索子字符串在大字符串中最后出现的位置,可以用rindex

4. 截取字符串:

My $part = substr($string,$initial_postion,$length); 5. 将非十进制的数字转换成十进制的数字: Hex(),oct();

因篇幅问题不能全部显示,请点此查看更多更全内容