perl语言总结
1.标量数据
1) 数字直接量
浮点数直接量 1.25 , 255.000 , 7.25e45 , -1.2E-23
整数直接量 0 , 2001 , -40 , 648638207267491 最后一个也可写成:64_8638_207_26749_1
非十进制整数 0377 #八进制 0xff , 0b11111111 #二进制 同样也可通过‘_’插入数字中。
数字操作符 2+3 ,5.1-2.4 , 3*12 , 14/2 ,10.2/0.3 , 10.5%3 , 2**3 #乘幂操作,表示2的三次方。
布尔值 数字0和空字符串为假。
2) 字符串
单引号字符串 'hello\n' #hello后面接的是'\'和n ,'\'\\' #表示为 '\
双引号字符串 "hello\n" #hello后面接的是换行符,其他转义字符:

转义字符含义: \n 换行 \r 回车 \t 水平制表符 \f 换页符 \b 退格 \a 系统响铃 \e ESC (ASCⅡ 编码的转义字符) \007 任何八进制的ASCⅡ(此例子007表示系统响铃) \x7f 任何十六进制的ASCⅡ(此例子7f表示删除键的控制代码) \x{2744} 十六进制表示的Unicode代码点(此例表示雪花形状的图形字符) \cC 控制符,也就是control键的代码(此例子此表示同时按下ctrl键和C键的返回码) \\ 反斜线 \" 反双引号 \l 将下个字符转为小写 \L 将到\E为止的所有字符转为小写 \u 将下个字符转为大写 \U 将到\E为止的所有字符转为大写 \Q 将到\E为止的非单词(non-word)字符加上反斜线 \E 结束\L、\U、\Q
字符串操作 "hello" . "world" #等同于"helloworld" , "fred" x 3 "fred" x (2+1) #得fredfredfred , 5 x 4.8 #得5555
字符串比较操作符 eq #相等 , ne #不等 , lt #小于 , gt #大于 , le #小于或等于 , ge #大于或等于
借助代码点创建字符 $alef = chr( 0x05D0 );
3) 操作技巧
defined函数 如果参数为undef,则返回假,否则返回真。
chomp函数 chomp($text = <STDIN>); #读入文字,略过最后的换行符
2.列表与数组
1) 列表属性
最后一个元素的索引值 $rocks[$#rocks] = 'hand rock'; #最后一块石头
列表直接量 (1,2,3) #包含三个元素 , (1..100) #100个整数构成的列表 , ("fred","barney")
qw简写 qw( fred barney betty ) #三个元素列表,其中空白符被抛弃 ,qw ! fred red ! ,qw / fred red / , qw # fred red # ,qw {,[,<...>,],}。
列表的赋值 ($fred , $barney ) = ($barney , $fred ) #交换两变量值 ,@rocks = qw/ bed ok /;
列表操作函数 $fred = pop(@array) ,push(@array ,0) ,$m = shift(@array) ,unshift(@array , 5)
splice操作符 @array = qw( pe di fr ba be); @removed = splice @array,2 #原来数组删了fr及之后的元素,被删的元素在removed中
@removed = splice @array,1,2 #删掉di,fr两个元素
@removed = splice @array,1,2,qw(wi) #删掉di,fr两元素并在其中添加wi元素
foreach控制结构 foreach $rock (qw / bed sla lava /){ print "one rock is $rock.\n"};
默认变量$_ 当未告知使用那个变量时,perl会自动使用默认变量
reverse操作符 @ba = reverse(6..10) #得 10,9,8,7,6
sort操作符 按ASCII排序
each操作符 my @rocks = qw/ bed sla rub gra /; while( my($index,$value) = each @rocks) {say "$index: $value"};
2) 标量上下文与列表上下文 (《perl语言入门》 P83)
@list = @people #得到姓名列表 , $n = @poeple #得到人数
3.子程序
1) 子程序概念
定义子程序 sub func {}
调用子程序 &func ,返回值 最后一次的运算结果为子程序的返回值
参数 sub max{if ($_[0] > $[1]) {$_[0]} else {$[1]}}}; $n = &max(10,15); #若超出@_的数组边界,将得到undef。
私有变量 my($m,$n); #用于子程序,if,while,foreach中 ,持久性私有变量 #用state来声明
use strict编译指令 #强制使用一些严格的,良好的编程风格
4.哈希表
1) 哈希表的概念
哈希表语法 $hash{$home_key} , $family_name{'fred'} = 'flint';
访问整个哈希 %some_hash = ('foo',35,'bar,12.4'); ,@array = %some_hash; #展开哈希,变成键值对列表
哈希赋值 my %new_hash = %old_hash; , my %inverse_hash = inverse %any_hash; #反序哈希,将键和值交换,但不允许出现重复的键!!
=>胖箭头 my %hash = ('fred' => 21,'free' => 45); #使用胖箭头的时候可以省略键的引号
2) 哈希函数
keys和values函数 my @k = keys %hash; my @v = values %hash;
each函数 while(($key , $value) = each %hash){ print "key => $value\n"}
操作函数 exists $book{"dino"}; #判断键是否存在 , delete $book{$person}
5.正则表达式初步
1) 简单模式
Unicode属性 \p{PROPERTY} , \p{Space} #匹配空白符 , \p{Digit} #匹配数字 ,\p{Hex} #匹配十六进制
元字符 点号(.) #匹配任意一个字符,换行符除外
(*) 匹配零次或多次 ,(.*)匹配任意字符零次到无限多次 , (+)匹配一次及以上 , (?)表示可有可无
模式分组 ()的作用是对字符串分组, 反向引用写法:在\后面添加数字,如/(.)\1/ #匹配连续出现的两个字符
$_ = "yabba dabba doo" , /y(.)(.)\2\1/ #匹配‘adda’ , /(.)\111/ #会报错
使用\g{N}能消除反向引用于模式的直接量部分的二义性。
择一匹配 /fred(and|or)barney/ #匹配任何含有 fredandbarney或fredorbarney的字符串。
2) 字符集
概念 指一组可能出现的字符,通过写在方括号[]中。它只匹配单个字符,但可以是字符集中出现的任何一个。
例如:[a b c d e f] ,[a-cw-z] ,[0-9]。[^def]会匹配这字符集以外的任何字符。
字符集简写:

\d 匹配一个数字的字符,和 [0-9] 语法一样 \d+ 匹配多个数字字符串,和 [0-9]+ 语法一样 \s 空格,和 [\n\t\r\f] 语法一样 \S 非空格,和 [^\n\t\r\f] 语法一样 \w 英文字母或数字的字符串,和 [a-zA-Z0-9] 语法一样 \W 非英文字母或数字的字符串,和 [^a-zA-Z0-9] 语法一样
6.用正则表达式进行匹配
1) 用m//进行匹配
语法 m// ,可以改写成 m( ),m<>,m{},m[] ...
匹配模式修饰符 用 /i 进行大小写无关的匹配 /yes/i
用 /s匹配任意字符。由于一般(.)无法匹配换行符,此模式会将其转换成[\d\D]来处理。
用 /x 加入空白符。如 / - ? [0-9]+ \.? [0-9]* /x
也可以组合选项修饰,如/six
用 /a 高速perl 采用ASCII方式,/u 则是采用unicode方式。 (《perl语言入门》 P161 )
2) 锚位
锚位概念 通过给定锚位,在指定位置匹配。\A 匹配绝对开头 ,\Z 匹配绝对结尾 。
过去(^)表示开头锚位,($)表示结尾锚位,目前以演化为 行首 和 行尾 锚位。加上/m修饰符 表示对多行内容进行匹配。没有/m是和\A,\Z功能一样。
单词锚位 /\bfred\b/ 表示匹配 fred ,但不匹配frederick等。因此 \b锚位匹配的是一组连续的\w字符开头和结尾。
绑定操作符 =~ 它高速perl,拿右边的模式来匹配左边的字符串。例如:$some_other =~ /\brub\b/ ,<STDIN> =~ /\bhello\b/ 。
3)捕获
捕获变量 $_ = "hello there, neighbor"; if(/(\S+) (\S+), (\S+)/){print "words were $1 $2 $3\n";} 。 #结果是 words were hello there neighbor
捕获变量的续存期 捕获变量能存活到下次成功匹配为止。
不捕获模式 /(?:xx)(xxx)(xx)/,(?:)告诉perl这对圆括号完全为分组而存在。
命名捕获 语法:(?<label>模式),label自行命名。于是访问量词为:$+{label}
自动捕获变量 if("Hello there, neighbor" =~ /\s(\w+),/){ print "That was ($`)($@)($')"} #结果输出(Hello)(there,)(neighbor) 。
其中($@)表示整个匹配区段,($`)表示匹配段前面略过的一段 ,($')表示匹配段后面剩下的一段。
适用量词 /a{5,15}/ #表示匹配重复出现5-15次的字母a,/(fred){3,}/ #表示匹配重复三次以上的...,
7.用正则表达式处理文本
1) 用s///进行替换
语法 s/bar/hello/; #表示将bar替换为hello。例子:s/with (\w+)/against $1's team/; 替换操作返回布尔值,成功替换为真,否则为假。
2) 适用g进行全局替换
s///只会进行一次替换,适用/g修饰符可以进行全局替换。例子:s/\s+/ /g; #实现了缩减空格,将任何连续空格转换为单一空格。
s/^\s+//; #消除开头的空格 , s/\s+$//; #消除结尾的空格
s///的定界符 s{}{},s[][],s<><>,修饰符/i,/,x/,/s 也可用于替换操作。 绑定操作 =~ 。
大小写转换 \U将所有字符转换为大写,\L将所有字符转换为小写。 例子:s/(fred|barney)/\U$1/gi;
默认情况下,它会影响之后全部替换字符串,因此可以采用\E关闭大小写转换。 例子:s/(\w+) with (\w+)/\U$2\E with $1/i;
使用小写 \l ,\u 之后影响紧跟随的第一个字符。可以使用\u\L 将字符转换为小写的,但首字母大小的单词。
3) split操作符
语法 my @fileds = split /separator/, string; 它会根据模式拆分字符串。例子: my @fileds = split /:/, "abc:def:g:h"; #得到("abc", "def" ,"g","h")
默认split函数会以空白符分隔$_中的字符串。
4) join函数
语法 my $result = join $glue,@pieces; #第一个参数是胶水,可以为任意字符串。其余参数则是一串片段,join会把胶水涂进每个片段之间并返回结果字符串。
5) 非贪婪量词
语法 (*?),(+?) ,(??)#要求在匹配过程中匹配的字符串越短越好,没匹配一个字符进行一次重视。而贪婪量词有频繁的回溯动作。
例子:/fred.+?barney/ 只有在fred和barney相距较近时采用此模式效率较高。
$_ = "I thourht you said Fred and <BOLD>Velma</BOLD>, not <BOLD>Wilma</BOLD>"; s#<BOLD>(.*?)</BOLD>#$1#g;
上例中必须采用非贪婪量词,因为贪婪量词会把整个句子的收尾的<BOLD>和</BOLD>之间的内容取出。