Dskpimc? · 2020年08月25日

Perl学习笔记—100个知识点

1、Perl里的注释是从井号(#)开始到行尾结束的部分;

2、在Unix系统里,如果文本文件开头的额最前端两个字符是#!,那么后面跟着的就是用来执行这个文件的程序路径。如:#! /usr/bin/perl;

3、在Unix系统上,可以使用chmod命令将程序文件的属性改为可执行,如:chmod a+x my_program,就可以用./my_program来执行程序了,命令开头的点号与斜线表示要在当前目录里查找这个程序,而不是通过环境变量中的PATH指定的路径去搜索。也可以采用perl my_program命令执行;

4、在perl 5.10及其后续版本里可以使用say语言来替代print,这样就不需要输入换行符,减少键入次数。由于这是个新特性,如果还没有安装Perl 5.10,可以使用use v5.10语句告诉perl,我们需要引入该版本的新特性;v可以省略,但如果省略的话,小数点后面就必须写成三位数字的形式;

5、perl想运行外部命令时,可以一对反引号(· ·)来调用;(反引号的按键在全尺寸的美式键盘上数字键1的左边)

6、Perl语言的分号的作用是隔离每段语句,而非表示语句的结束,如果后续没有语句,那么不用分号也没关系;

7、Perl处理数字时用的是底层C库,且统一使用双精度浮点数来存储数据,所以10/3得到的是浮点数3.3333...,而不是取整的3;但Perl支持取模运算,用符号%表示,表达式10%3的结果是1,也就是10除以3的余数。注意,取模运算操作符先取整,再求余数,所以10.5%3.2和10%3的计算结果是相同的;

8、Perl支持Unicode,如果你想要在源代码中使用Unicode书写直接量的话,得手工加上utf8编译指令;所谓的编译指令,是指用于告诉perl编译器该如何执行动的指令。

9、除了单引号和反斜杠字符外,单引号内所有字符都代表他们自己。如果要在字符串中使用单引号和反斜杠,需要添加一个反斜线用做转义;

10、可以通过编译指令启用警告机制:use warnings;也可以在命令行调用程序时给出-w选项表示启用警告机制。这种方式的作用域包括引入模块的代码,所以可能会看到有关别人代码的警告信息:perl -w my_program;或者在shebang行启用警告选项:#!/usr/bin/perl -w;

11、如果看不懂警告信息说的是什么,可以利用diagnostics编译命令,在perlding文档中列出了每个警告信息的简短描述和详尽解释:use diagnostics;

12、变量区分大小写,可以采用字母或下划线开头,不同大小写字符、数字以及下划线构成了不同的标识符;

13、为了提高数字的可读性,perl允许在整数直接量中加入下划线,将若干位数分开,如:123_8888_0192;

14、perl没有专用的布尔(Boolean)数据类型,它是靠一些简单的规则来判断给定值的真假:如果是数字,0为假,所以其他数字都为真;如果是字符串,空字符串(' ')以及字符串'0'都为假,所有其他字符串都为真;如果变量还未被赋值,那么返回假;要取得相关的布尔值,可以用!单目取反操作符;

15、Perl程序可以用行输入操作符<STDIN>来获取从键盘输入的值,每次代码运行到出现<STDIN>的时候,perl就会从标准输入设备读取完整的一行标量值,也就是第一个换行符前所有的内容,这个内容就称为<STDIN>位置上的值。标准输入可以有多种输入源,默认来自键盘的用户输入;在标量上下文中,<STDIN>返回的是输入数据的下一行内容;在列表上下文中,返回的则是所有剩下行的内容,一行一个元素,直到文件结尾;在列表中,如果输入数据来自某个文件时,它会读取文件的剩余部分,但如果输入数据的来源是键盘,在Unix或类似系统(包括Linux和Mac OS X)中,一般是键入Ctrl+D来告知系统,不会再有任何输入了,对DOS/Windows系统来说,对应的按键是Ctrl+Z;

16、chomp操作符用于去掉字符串末尾的换行符;

17、如果希望在命令行尝试而不特地地创建程序文件,可以用-e开关指定要执行的程序:perl -e ‘print “hello world\n”’;另外还有一个开关-l,启用后会自动在输出内容后添加换行符:perl -le 'print Hello world“”'

18、 perl中只要拿掉括号不会改变原意,括号就可以省略;

19、列表(list)指的是标量的有序集合,而数组(array)则是存储列表的变量。列表指的是数据,而数组指的是变量;列表的值不一定要放在数组里,但每个数组变量都一定包含一个列表(即便是不含任何元素的空列表);

20、对于数组而言,想找出数组里最后一个元素的索引值,如数组rocks而言,最后一个元素的索引值是$#rocks;

21、可以使用数组负数数组索引值来从数组尾端往回计数,有效的负数索引值为-1(最后一个元素)、-2(倒数第二个的元素)以及-3(倒数第三个元素),以此类推;

22、列表直接量可以由小括号内用逗号隔开的一串数据表示,而这些数据就称为列表元素,如(1, 2, 3) #包含1/2/3这三个数字的列表;列表中的元素可以不必都是常数,它们可以是表达式,在每次用到这些直接量时再被重新计算;

23、一个列表可能包含任意取值的元素,如:("fred", "barney", "betty", "wilma", "dino"),可以采用qw简写可以快速输入,免除反复键入引号和逗号,简化定义:qw(fred barney betty wilma dino),这个之前效果相同,但少按了不少键;qw表示quoted word(用引号引用的词)。perl会将qw内的词当成单引号的字符串来处理,所以在qw构建的列表中,不能像双引号内的字符串一样使用\n之类,其中的空白字符(如空格、制表符以及换行符)会被抛弃,然后剩下的就是列表的元素;qw的前后定界符可以是任何标点符号,如果左边是某个成对符号的开始字符,那么右边必须是对应的关闭字符,如:qw < fred bar dd oaiw ddwl >

24、数组的使用方式,如数组rock有三个元素,使用单个元素可以用$rock[0]、$rock[1]、$rock[2],如果想引用整个数组时,只需要在数组名前加上@字符(后面没有检索用的方括号)就可以:@rock;

25、数组右端方向是数组下标值升高的方向,所以尾端的下标值最高,如果需要对数组右边即尾端添加新元素或者去除旧元素,可以采用pop和push操作符;

26、unshift和shift操作符是对数组的开头(或者说是数组的"左"边,最低下标值的部分)进行处理;

27、splice操作符是对数组的中间元素进行处理,该操作符最多有四个参数,最后两个是可选参数。第一个参数是要操作的目标数组,第二个参数是要操作的一组元素的开始位置,第三个参数指定要操作的元素长度,第四个参数是要替换的列表;

28、foreach常用于处理整个数组或列表的数据,它能逐项遍历列表中的值,依次提取使用;在每次循环迭代时,控制变量并不是列表元素的复制品——实际上,它就是列表元素本身。也就是说,假如在循环中修改了控制变量的值,也就同时修改了这个列表元素;

29、$_是perl的默认变量,大部分情况下如果不加说明,perl就会默认使用$_,如果foreach循环开头省略控制变量,perl就会用默认变量$_;

30、sort操作符会读取列表的值(一般来自数组),依次按字符的内部编码顺序对它们排序;

31、each操作符可以用于提取数组的元素值和数组索引;

32、reverse操作符会读取列表的值(一般来自数组),并按相反次序返回新的列表;

33、print输出的可以是一系列以逗号隔开的值,如:print “the answer is”, 6*7, ".\n";

34、子程序归属于独立的命令空间,因此同名的子程序和标量不相关;

35、子程序定义先用关键字sub开头,再写上子程序名(名字是不含与号),然后写上花括号,封闭在其中的代码块就是子程序的主体;子程序可以被定义在程序中的任意位置,不需要对子程序进行事先声明,子程序的定义是全局的;

36、子程序都有返回值,子程序在执行过程中最后一次运算结果都会被自动当作返回值;

37、子程序支持参数传入,在传递参数列表到子程序里,只要在子程序调用的后面加上括号列表就行。perl会自动将参数列表化名为特殊的数组变量@_,该变量在子程序执行期间有效,子程序可以访问这个数组,以判断参数的个数以及参数值;@_变量是子程序的私有变量,加入已经有了全局变量@_,则该变量在子程序调用前会先被存起来,而不用担心遗失自己的@_变量——就算是嵌套的子程序在访问私有的@_变量时也一样。这和foreach循环保存控制变量的机制相同,变量的值都是被perl自动地保存和恢复的;

38、perl中可以用my操作符来创建私有变量,或称为词法变量,这些变量属于封闭语句块中的私有变量(或者也可以称作有限作用域变量),语句块之外任意地方的同名变量都完全不受这两个私有变量的影响;反过来,外部变量同样无法影响内部的私有变量;

39、可以使用use strict编译指令告诉perl内部编译器,接下来的代码块或是程序源文件的代码应该严谨遵循优良编程风格;从perl 5.12开始,如果使用编译指令指定最低Perl版本号的话,就相当于隐式使用约束指令,如use v5.12; #自动加载strict编译指令。现在,所有的约束中,perl首先会坚持要求你声明所有新出现的变量,一般加上my就可以了;

40、使用return操作符可以立即停止运行并从子程序内返回某个值;

41、如果编译器在调用子程序前看到过子程序的定义,或者Perl通过语法规则判断它只能是子程序调用,就可以像内置函数那样省略与号,但如果可能和内置函数有冲突的话,必须要带上与号;

42、使用state操作符声明的变量可以在子程序多次调用期间保留之前的值,而其作用域仍局限在子程序内部,和my定义的私有变量有点不一样,my定义的私有变量在每次调用子程序时会被重新定义;

43、perl 5.20增加了子程序签名,子程序签名类似于SystemVerilog的形式参数;

44、<>钻石操作符可以从用户指定的位置读取数据流;

45、perl中当前正在处理的文件名会被保存在特殊变量$ARGV中,如果当前是从标准输入获取数据,那么当前文件名就会是连字符“-”;

46、chomp操作符如果后面直接接“;”符号,即不加参数,此时chomp会直接作用在$_上;

47、<STDIN>为行输入操作符,每次读取一行,用一对尖括号表示,被它包围的文件句柄(filehandle)表示数据来源;由于行输入操作符在读到文件结尾,没有可读内容的时候会返回undef,所以借此可以跳出循环;

48、程序的调用参数(invocation argument)通常是命令行上跟在程序名后面的几个“单词”,如: $ ./my_program fred barney betty,这条命令是指执行当前目录下的my_program命令,让它依次处理fred、barney和betty。若不提供任何调用参数,程序会从标准输入流采集数据。但有个例外,如果调用参数是连字符(-),则表示从标准输入读取数据。所以加入调用参数是fred - betty,那么程序应该先处理文件fred,然后处理标准输入流中提供的数据,最后才是文件betty;当前正在处理的文件名会被保存在特殊变量$ARGV中,如果是从标准输入获取数据,那么当前文件名就会是连字符“-”;

49、<< >>双钻石操作符和钻石操作符功能相同,只不过不再启动外部程序;

50、在命令行中程序的调用参数会放在@ARGV数组里,这个数组是perl解释器事先建立的特殊数组,并在程序运行前根据命令行参数初始化,本质和其它数组一样,只不过是在程序开始运行时@ARGV里就塞满了调用参数;我们也可以在调用钻石操作符之前对@ARGV强行赋值修改,这样到钻石操作符时就会只执行我们修改后的@ARGV,而不是默认的调用参数;

51、print操作符会读取它后面的参数列表中的所有元素,并把每一项依次送到标准输出;

52、printf操作符的参数包括“格式字符串”及“要输出的数据列表”,格式字符串就是用来填空的模板,代表你想要的输出格式;格式字符串里可以有多个转换,每种转换都会以百分比(%)符号开头,然后以某个字母结尾。%g会按需要自动输出浮点数,整数甚至是指数形式;%d表示十进制整数,它会舍去小数点后的数字,它是无条件截断,而非四舍五入;%x表示十进制数;%o表示八进制数。在perl里,printf常用于在字段式的数据输出上,因为大多数的转换格式都可以让你指定宽度,如果数据太长,字段会按需要自动扩展;%s代表字符串格式,所以它的功能是字符串内插,但同时还支持设定字段宽度。如果宽度字段是负数,则表示左对齐;%f表示浮点数转换格式,它可以按需四舍五入,甚至可以指定小数点后的位数;如果要输出真正的百分号,则用%%;

52、文件句柄(filehandle)实际上是perl程序里代表perl进程和外界进行I/O通信时相联系的名字,不是文件的名字,通过这种机制,perl几乎可以和任何一个外部实体交换信息;建议文件句柄用大写字母来命名;STDIN、STDOUT、STDERR、DATA、ARGV和ARGVOUT是perl保留字,不可使用;

53、当程序启动时,文件句柄STDIN就是Perl进程和它的输入源之间的联系,也就是标准输入流(standard input stream),它通常是用户的键盘输入,除非用户要求别的输入来源,像从文件读取输入或经由管道(pipe)读取的另一个程序的输出;标准输出流(standard output stream)STDOUT是默认情况下它会输出到用户的终端屏幕,但用户也可以把输出结果传送到某个文件或另一个程序;如:$cat fred barney | sort | ./your_program | grep something | lpr :意思是由cat命令将文件fred的每一行输出,再加上文件barney里的每一行,之后将以上输出作为sort命令出入,对所有的行进行排序,继而把排序结果交给当前路径下的your_program处理,your_program完成相应操作后,再将输出数据送到grep,通过它把数据中的某些行挑出来丢弃,并将剩下的数据输出到lpr这个命令,让它负责吧最终结果传送给打印机打印处理。标准错误流(standard error stream)STDERR,即错误信息存储的地方,错误信息在默认情况下通常是输出到用户的屏幕,但用户可以用shell命令将错误信息转向某个文件,如:./your_program > /tmp/my_errors

54、$./your_program <dino >wilma,这条告诉perl,程序的输入应该来自文件dino,即dino的每行都会送入到STDIN,输出应该送到文件wilma,即STDOUT输出会送到wilma,这个程序本身只管从STDIN读入数据,再按照我们的要求处理这些数据,之后只要把输出送到STDOUT即可,别的什么都不用管,交给shell来处理;

55、open CONFIG, 'dino'; #打开名为CONFIG的文件句柄,让它指向文件dino;

open CONFIG, '<dino'; #以只读方式读取dino,而非写入;

open CONFIG, '>fred'; #创建一个新文件,会打开文件句柄CONFIG并输出到新文件fred,和重定向一样,如果已经存在一个名为fred的文件,那么就清除原有的内容并以新内容取代之;

open LOG, '>>logfiel'; #两个大于号指明以追加方式来打开文件,如果文件原本就存在,那么新的数据将会添加在原有文件内容的后面;如果它不存在,就会创建一个新文件,和只有一个大符号的情形相同;

56、从Perl 5.6开始,open支持三个参数形式的写法:

open CONFIG, '<', 'dino';

open CONFIG, '>', $file_name;

57、处理完某个文件句柄后,可以用close操作符关闭它:close DENROCK;

58、如果程序执行到致命错误,可以用die处理,die函数的参数是要发出的错误信息文本,一般会输出到标准错误流,同时它会让程序退出运行,并在shell中返回不为0的退出码表示异常退出;

59、在Unix中运行的程序都会有一个退出状态(exit status),用来通知操作系统该程序的运行是否成功。那么以调用其他程序为工作内容的程序会查看那些程序的结束状态来判断是否一切顺利。所谓的”结束状态”其实只用一个字节来表示,所以它能传递的信息不多 。传统上,0代表成功,非0代表失败;

60、特殊变量$!用于存放系统错误信息,保存着最后一刻的系统错误信息;

61、从perl 5.10开始,autodie编译指令已成为标准库的一部分,会在发现错误时自动帮你调用die发出错误信息;这条编译指令会识别perl内置函数是否调用操作系统接口,这种调用时出现的错误并非程序员所能控制的;

62、默认情况下,如果不为print或printf指定文件句柄的话,它们的输出会送到STDOUT,要改变默认的输出文件句柄,可以用select操作符指定,如:select BEDROCK; #把输出的默认文件句柄改成BEDROCK;

63、从perl5.6开始,文件句柄可以存放到标量变量中,而不必非得使用裸字;

64、哈希是一种数据结构,它和数组的相似之处在于可以容纳任意多的值,并可按需取用;哈希里没有顺序,因此也没有所谓的第一个元素,有的是一堆键-值对的集合;要访问哈希元素,需要使用如下语法:$hash{$some_key};这与访问数组的做法类似,只是用了花括号而非方括号来表示索引建,并且键表达式是字符串,而非数字;

65、挑选哈希名字时,最好能让哈希名和键名之间能放进去一个“for”字,比如family_name for fred 是fiintstone,能够清晰反映出键-值之间的关系;

66、要指代整个哈希,可以用百分号%作为前缀,如:%family_name;

67、可以使用reverse对哈希进行反转键-值对,得到逆向检索的新哈希;

68、perl可以使用胖箭头来区分键和值的成对关系,如:my %last_name = ('fred' => 'xxx', 'dino' => undef, 'barney' => 'dfa');

69、keys函数能返回哈希的键列表,values函数能返回对应的值列表,如果哈希没有任何成员,则两个函数都返回空列表;

70、如果要遍历哈希的每个键-值对,可以使用each,每次调用它会以列表形式返回两个元素,一个是键名,一个是值。再次调用它会返回下一个键-值对,直到所有元素都遍历完毕,没有数据返回时,它会返回空列表;实践中,唯一合适使用each的地方是在while循环中,如:while( ($key, $value) = each %hash ){ print "$key => $value\n"; }

71、exists函数可以用来检查哈希中是否存在某个键,键存在的话它会返回真,不存在的话它会返回假,这和键对应的值无关;

72、delete函数能从哈希中删除指定的键及其相对应的值,假如没有这样的键,那就直接结束,不会出现任何警告或错误信息;和存入undef不一致,存入undef的话,键仍然存在;

73、perl会把环境信息放到特殊哈希%ENV里面,可以使用;

74、perl的匹配模式中,默认去匹配$_中的字符串;

75、写在匹配操作符中的模式文本相当于写在双引号内,所以在双引号内的写法同样适用于此,像\t和\n这样特殊的序列表示的是制表符和换行符,这和写在双引号中的意义相同;

76、点号.能匹配除换行符外的任意单个字符;点号是元字符,既然是元字符,那么要匹配它本身,同样要先转义;

76、量词可以指定匹配项的重复次数,量词也是元字符,它把写在它之前的字符作为要匹配的目标,然后定义它该重复匹配的次数;

77、圆括号()匹配到字符串可以在表达式内重复利用,即反向应用,由于能取得匹配结果,我们称这种括号围起来的分组为捕获分组,反向应用的写法是在反斜线后面接上数字,每个数字代表对应的捕获分组,按括号出现的先后次序而定。从Perl 5.10开始引入了新的标记反向引用的写法,对应反斜线加数字编号,新的写法使用\g{N}的形式,其中g表示分组,N就是原来的数字编号;

78、正则匹配的模式中的竖线字符|,也成为或,表示择一匹配,要么匹配左侧部分,要么匹配右侧部分撇皮。如果左侧模式匹配失败,那就尝试右侧模式;

79、\A锚位匹配字符串的绝对开头,\z锚位表示要匹配字符串的绝对末尾,\Z允许后面出现换行符,\b是单词边界锚位,它能撇皮任何单词的首尾非单词边界锚位是\B,它能匹配所有\b不能匹配的位置;

80、正则表达式末尾可以追加一些修饰用的字符,用以调整模式的匹配行为,这些修饰符有时也被称作标志(flag)。/i表示进行大小写无关的匹配;/s表示匹配任意字符;/x表示加入辅助空白字符;也可以对这些flag联合使用;

81、m//模式匹配可以实现文字的查找功能;s///可以实现替换操作功能,会把存在变量中匹配模式的那部分内容替换成另一个字符串;

82、s///默认只会进行一次替换,/g修饰符可以让s///替换所有符合条件的字符串;

83、\U转义符会将其后的所有字符转换成大写的,\L转义符会将它后面的所有字符转换成小写的;

84、split操作符会根据模式拆分字符串为一组列表,如my @field = split /separator/, $string;

85、join函数和split功能相反,join会把这些片段拼接合成一个字符串;

86、在if控制结构中,只有当条件表达式为真时,才执行某块代码,如果想让代码块在条件为假时才执行,可以把if改成unless;

87、while是执行到直到条件为假时跳出循环,until相反,是执行到条件为真时跳出循环;

88、如果某个变量只会在几行代码里使用,可以把这几行放到一个裸块{ }里并就近声明变量;

89、last操作符能立即中止循环的执行,就像在C语言中的break操作符一样;

90、perl中有5中循环块,分别为for、foreach、while、until和裸块{ }。if块和子程序带的花括号不是循环快,像last只对循环快起作用;

91、next操作符会结束当前这次循环迭代,跳到当前循环块的底端,类似C语言的continue;

92、redo操作符会让循环快返回到当前循环块的顶端,不经过任何条件测试,也不会进入下一次循环迭代;next和redo两者之间最大的区别在于,next会正常继续下一次迭代,而redo则会重新执行这次的迭代;

93、perl提供了一组用于测试文件的操作符,借此返回特定的文件信息,所有这些测试操作符都写作-X的形式,其中X表示特定的测试操作;

94、如果不希望当前工作目录保持在程序文件所在目录,可以用chdir操作符修改,用法和shell里的cd命令一样,如chdir '/etc' or die "cannot chdir to /etc: $!"。由perl程序启动的所有进程都会继承perl程序的工作目录,但对于调用perl程序的进程比如shell来说,它的工作目录是无法通过perl修改的,我们可以改动当前运行程序的工作目录,但无法改动父进程的工作目录;

95、在某些情况下,可能要修改某个文件最近的更改或访问时间以欺瞒其他程序,可以用utime函数来修改,它的前两个参数是新的访问时间和更改时间,其余参数就是要修改时间戳的文件名列表;

96、sprintf函数与printf函数有相同的参数,但它返回的结果是字符串,而不是直接打印出来,此函数的方便之处在于,你可以将格式化后的字符串存放在变量里以便稍后使用;

97、在perl中,可以用system函数启动子进程。system命令根据当前进程创建一份拷贝,这份拷贝成为子进程,在子进程运行时,perl会等待它执行结束后才继续。如果要让perl早点退出子进程的执行,可以在命令行结尾带个与号;

98、exec函数和system函数类似,不过system函数会创建子程序,子程序会在perl睡眠期间执行任务,而exec函数会使当前的perl进程自己去执行任务,这有点像“goto”语句执行到一半跑去别处做事,而不是就地调用子程序处理;

99、system和exec命令执行的输出都会被重定向到perl的标准输出,如果要将输出结果捕获成字符串,只要用反引号代替单引号或双引号就可以了,也可以使用qx()操作符;

100、perl既可以同步控制子程序,即启动一个命令,然后等它结束,然后也许还会捕获输出,也可以启动一个异步运行的子进程,并和它保持通信,直到子进程结束运行为止;

更多相关阅读

Perl处理文本方法
CPU Cache知识

作者:谷公子
首发博客:https://blog.csdn.net/W1Z1Q/article/details/103333281
更多IC设计相关的文章请关注IC设计极术专栏,每日更新。
推荐阅读
关注数
20200
内容数
1307
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息