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
View Code

         字符串操作  "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] 语法一样
View Code

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>之间的内容取出

 

posted @ 2016-10-08 22:50  ZYVV  阅读(1196)  评论(0)    收藏  举报