perl笔记

学习网址:http://www.cbi.pku.edu.cn/chinese/documents/perl/perl2.htm

一、基础

  1:以#! /usr/local/bin/perl -w开头

        整数是浮点数特例,寄存在浮点寄存器中。0开头是八进制、0x是16进制。

        定义变量:$var = "some data"; 或者 $var = 0;注意:字符串结尾没有NULL

        \b:回车、\E:结束(\U,\L,\Q)作用范围、\U:直到\E之间的字符全转换成大写、

        \L:与\U相反、\l:下一个字符小写、\Q不匹配特殊模式字符、 \r,\n,\b回车换行Tab。

        用\取消转义。

        eg:     $a = "T\LHIS IS A \ESTRING"; # same as "This is a STRING"
        单引号字符串与双引号字符串有两个区别:一是没有变量替换功能,二是反斜线不支持转义字符。但是可以跨多行

        eg:  $text = 'This is two
                   lines of text
                   ';   #等效:$text = "This is two\nlines of text\n";       

        字符串和数值直接运算:

        eg: $result = "hello" * 5;  # $result = 0 || $result = "12a34" +1; # $result = 13 || $result = "43" + 34; #result=77;

  2:算术操作符

        整数比较:< 小于、> 大于、== 等于、<= 小于等于、>=大于等于、!= 不等于、<=> 比较返回1、0、-1

        字符串比较:lt 小于、gt 大于、eq 等于、le 小于等于、ge大于等于、ne不等于、cmp比较返回1、0、-1

        逻辑操作符: || :或、&& 与、xor异或、! $var

        位操作符:&:位与、|:位或、~:位非、^:位异或、$x << 1:位左移、$x >> 1:位右移

       字符串联结和重复操作符:“.”链接、“x”重复。
       eg:$newstring = "potato" . "head";    $newstring = "t" x 5;    $result = $var == 0 ? 14 : 7;

二、  文件操作

         打开open:
       
open (MYFILE, "file1") || die ("Could not open file");   #以制度方式打开文件file1
        open(outfile,">outfile") || die ("Could not open file");  #以写方式打开文件file1
        open(appendfile, ">>appendfile") || die ("Could not open file");  #以追加方式打开
        用close(MYFILE); 关闭文件

        读文件:
        $line = <MYFILE>;  #文件一行行读入line变量中并将指针指向下一行。
        @array = <MYFILE>; #文件的每行全部读入array数组中,每个元素为一行(含回车)。

        写文件:
        print MYFILE ("Here is an output line.\n"); || print STDIN/STDOUT $var;

        判断文件类型:
        语法为:-op expr,
       
eg:  if (-e "/path/file1") {    print STDERR ("File file1 exists.\n");    } #是否存在
        常用判断:-e :存在?、 -d :目录?、-f :普通文件、-r :可读? -w:可写? -x:可执行?、-z :空文件?
        eg:open(INFILE, "infile") && !(-e "outfile") && open(OUTFILE, ">outfile") || die("Cannot open files\n");

       
 命令行参数:
        存储命令行参数的数组@ARGV[ ] ;$var = $ARGV[0]; # 第一个参数、$numargs = @ARGV; # 参数的个数
        eg: @ARGV = ("myfile1", "myfile2"); #实际上由命令行参数赋值|
                       while ($line = <>) {    print ($line);    } 
                    #1、当PERL解释器第一次看到<>时,打开以$ARGV[0]为文件名的文件;
                    #2、执行动作shift(@ARGV); 即把数组@ARGV的元素向前移动一个,其元素数量即减少了一个。
                    #3、<>操作符读取在第一步打开的文件中的所有行。
                    #4、读完后,解释器回到第一步重复

        eg: 用管道发送邮件如下:
                  open (MESSAGE, "| mail dave");
                  print MESSAGE ("Hi, Dave! Your Perl program sent this!\n");
                  close (MESSAGE);
      
  my %opt= ();  #定义句柄
        GetOptions(\%opt, 'user_control','list_control','sender|s=s','receive|r=s'); #定义参数
        $memd->delete($opt{username}); #获得
三、   模式匹配 (用\转义)
         模式指在字符串中寻找的特定序列的字符,由反斜线包含:/def/ = 模式def。
        
eg:@array = split(/ /, $line);  #以空格分隔行到数组中。

         匹配操作符:“ =~ ”若匹配,为真;“ !~ ”若不匹配为真
         $question =~ /please/  :在questuin串中寻找please这个单词 成功返回真,否则是假。

         字符 + :贪婪匹配一个或者多个+前面的字符;eg:@array = split (/ +/, $line);#多个空格分隔时。
                          (split:不判断第一个是不是空格,默认装入array[0],余下判断,TAB作为一个单词)。

          

         字符[ ]和[^ ] :匹配[ ]中的一个字符,eg:/a[0123456789]c/ ;与+联合使用:/d[eE]+f/ 匹配含一个以上e/E字符。
                                  [^ ]表示除其之外的所有字符,eg:/d[^deE]f/   匹配d加非e字符加f的字符串。
                                  [ 0-9a-zA-Z] :是匹配某个的简写

         字符 *和? :* 匹配0个、1个或多个相同字符; ?匹配0个或1个该字符。
                                 eg:/de*f/  匹配df、def、deeeef等; /de?f/匹配df或def

         字符 ^和$: “ ^ ” 以xxx开头的行(串);“ $ ”以xxx结尾的串;“\b“在单词边界匹配;“\B”在单词内部匹配。
                                
eg:/\bdef/ 匹配defghi等以def打头的单词,不匹配abcdef。/def\b/ 匹配abcdef等以def结尾的单词,但不匹配defghi,/\bdef\b/只匹配字符串def。注意:/\bdef/可匹配$defghi,因为$并不被看作是单词的部分。/\Bdef/匹配abcdef等,但不匹配def;/def\B/匹配defghi等;/\Bdef\B/匹配cdefg、abcdefghi等,但不匹配def,defghi,abcdef。
        \d、\D、\w、\W、\s、\S: \d = [0-9] ; \D = [^0-9]; \w = [_0-9a-zA-Z]; \W = [^_0-9a-zA-Z] ;\s = [ \r\t\n\f ] ;\S = [^ \r\t\n\f];
                                                 
        eg:/[\da-z]/匹配任意数字或小写字母。

       匹配所有字符:“ .* ”:“ . ”匹配所有字符 “ * ”匹配>=0个

       匹配指定数目的字符:字符对{}指定所匹配字符的出现次数。如:/de{1,3}f/匹配def,deef和deeef;/de{3}f/匹配deeef;/de{3,}f/匹配不少于3个e在d和f之间;/de{0,3}f/匹配不多于3个e在d和f之间。

       指定选项两个任选:字符"|"指定两个或多个选择来匹配模式。如:/def|ghi/匹配def或ghi。

       模式的部分重用: 当模式中匹配相同的部分出现多次时,可用括号括起来,用\n来多次引用,以简化表达式:
                                        /\d{2}([\W])\d{2}\1\d{2}/ 匹配:
                                       12-05-92
                                       26.11.87
                                       07 04 92等
                                       注意:/\d{2}([\W])\d{2}\1\d{2}/ 不同于/(\d{2})([\W])\1\2\1/ ,后者只匹配形如17-17-17的字符串,而不匹配17-05-91等。

         $n、$&:匹配到的()的数据用$1,$2,$3等表示; $&表示匹配全部。

         g、i、x、m、o、s:eg:@matches = "balata" =~ /.a/g; # now @matches = ("ba", "la", "ta")  匹配所有可能的模式;当使用了选项g时,可用函数pos来控制下次匹配的偏移:  $offset = pos($string);   pos($string) = $newoffset;
                                               eg: /de/i 匹配de,dE,De和DE。忽略大小写
                                               eg: /a.*bc/s匹配字符串axxxxx \nxxxxbc,但/a.*bc/则不匹配该字符串。将串看成单行。
                                               eg: /\d{2} ([\W]) \d{2} \1 \d{2}/x  等价于 /\d{2}([\W])\d{2}\1\d{2}/   忽略模式中的空格

         替换操作符:语法为s/pattern/replacement/,其效果为将字符串中与pattern匹配的部分换成replacement ;可以与上面的g/i/o/e/m/s/x配合用。

         翻译操作符tr:tr /string1/string2/,string2为替换部分,把string1中的第一个字符替换为string2中的第一个字符,把string1中的第二个字符替换为string2中的第二个字符,依此推。当string1比string2长时,其多余字符替换为string2的最后一个字符;当string1中同一个字符出现多次时,将使用第一个替换字符。(c/d/s)c :翻译所有未指定的字符;d :删除所有指定字符;s:把多个相同的输出字符缩成一个。
eg:$string =~ tr/\d/ /c;把所有非数字字符替换为空格。$string =~ tr/\t //d;删除tab和空格;  $string =~ tr/0-9/ /cs;把数字间的其它字符替换为一个空格

四、循环

          1:if......else......
           if ( <expression>) {
                    <statement_block_1>
           }
          elsif ( <expression> ) {
                   <statement_block_2>
           }
           ...
          else{
                   <statement_block_3>
           }
          2:while......
          while ( <expression> ) {
                 <statement_block>
          }
          eg: open (READ,"Filename");
                open (WRITE,"Filename");
                while (<READ>) {
                       print WRITE ("$_");
                 };close(WRITE);close(READ);
         3:until......
         until ( <expression> ) {
               <statement_block>
         }

         4:for......
             
for ($count=1; $count <= 5; $count++) {
                  # statements inside the loop go here
             }

         5:foreach......
               foreach localvar (listexpr) {
                   statement_block;
              }  #此处的循环变量localvar是个局部变量,如果在此之前它已有值,则循环后仍恢复该值。

         6:do......
              do {
                          statement_block
             } while_or_until (condexpr);
退出循环为last,执行下一个循环为next ,重复此次循环redo。

        单行条件:语法为statement keyword condexpr。其中keyword可为if、unless、while或until。
 
       eg:
               print ("This is zero.\n") if ($var == 0);
               print ("This is zero.\n") unless ($var != 0);
               print ("Not zero yet.\n") while ($var-- > 0);
               print ("Not zero yet.\n") until ($var-- == 0);
  虽然条件判断写在后面,但却是先执行的。

五、子程序

       1:子程序定义  sub functionsub{    statements;  }  调用functionsub(); 一般先定义后调用。返回值为return(vatval);

        2:定义变量:my、local : my定义的变量只在该子程序中存在;local存在于该子程序和该子程序调用的子程序中,但不在主程序中
              eg:my $var = "abcd"; local @array = {1,2,3,4,5,6};

        3:参数传递:_@
              &addlist (@mylist);    #先调用后定义用&调用
              &addlist ("14", "6", "11");
              &addlist ($value1, @sublist, $value2);
              ...
              sub addlist {
                       my (@list) = @_;  #参数讲送入list元素中
                            ...
               }

               参数为数组时,子程序只将它赋给一个数组变量。如
               sub twolists {
                       my (@list1, @list2) = @_;
               }
              中@list2必然为空。但简单变量和数组变量可以同时传递:
              &twoargs(47, @mylist); # 47赋给$scalar,@mylist赋给@list
              &twoargs(@mylist); # @mylist的第一个元素赋给$scalar,其余的元素赋给@list
                     ...
              sub twoargs {
                        my ($scalar, @list) = @_;
                         ...
              }
         4:用别名传递数组参数:
               用前面讲到的调用方法&my_sub(@array)将把数组@array的数据拷贝到子程序中的变量@_中,当数组很大时,将会花费较多的资源和时间,而用别名传递将不做这些工作,而对该数组直接操作。形式如:
               @myarray = (1, 2, 3, 4, 5);
               &my_sub(*myarray);

               sub my_sub {
                       my (*subarray) = @_; 
               }   #subarray是myarray的别名。

         5:递归子程序:除了不被子程序改变的变量外,所有的变量必须的局部的

         6:预定义的子程序:
              
BEGIN子程序在程序启动时被调用;END子程序在程序结束时被调用;AUTOLOAD子程序在找不到某个子程序时被调用:
               eg:BEGIN {   print("Hi! Welcome to Perl!\n");  }
                        AUTOLOAD{
                                        print("subroutine $AUTOLOAD not found\n"); # 变量$AUTOLOAD即未找到的子程序名
                                        print("arguments passed: @_\n");
                                     }






                                               





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值