保持快乐,善于表达,敢于创新

Perl 语言基础

上一篇 / 下一篇  2010-06-13 15:14:31 / 个人分类:Shell编程

1. 标量:
  双引号:可以转义,无论转义字符或变量。
  $bbb = 5
  print "aaa $bbb \n"  == print "aaa ${bbb}" . "\n"  ==>aaa5
  ${} 为了区别于其他含有相同的变量。
  print "aaa $bbbb \n"  ==> aaa, 因为$bbbb 不存在。
  print "aaa ${bbb}b \n" ==>aaa5b, 用到$bbb的值。

  单引号:除 ' 和 \ 这两个符号转义外,其他都不可以转义。
  print 'aaa \' \\'  ==>  aaa'\
  print 'aaa $bbb'   ==>  aaa$bbb

2. 布尔值
   若为数字, 0为假,其他为真。
   若为字符串,空为假,其他为真, 空指 "0", "", undef

3. <STDIN>
   <STDIN>每次都接受到\n的字符,即使没有输入任何内容
   $line = <STDIN>
   if($line eq "\n")
    print " you input blank value";

4. chomp 就是去除每次输入的字符串末尾的\n字符。
   chomp($line = <STDIN>)

5. undef:
   初始变量时候是undef就是他什么都不是,使用define去检测是否为define,如果初始变量时候可以认为数字就把他当成0,字符串就当成"", 但绝对不是0或"",每当出现异常时候,变量内容为undef,主要判断变量是否被使用到!
6. define:
   define()是为了检验undef十分为undef的值,如果是undef就返回false, 否则就true.

复数概念
7. 数组
   数组名字前面加一个@,就是一个数组,读 all of the, 如:arrary[] = @arrary
   从0开始计数, 访问数组元素 $arrary[0], $arrary[1] ...
   数组使用非常灵活,可以自动增加和减小。增加部分是undef, 减小时候舍去后面部分。
   特出索引:
   $end = $#arrary;  arrary[]的最后一个元素索引号。
   $arrary[$#arrary] = "aaa" 给最后一个元素赋值。
   $arrary[-1]        arrary[]的最后一个元素。
8. 列表
   用()括起来的内容就是列表,里面用逗号分开。
   qw = quoted by whitespace
   qw ! aaa bb ddd ccc !  在!!里面用空格分开的列表。
   列表可以赋给数组:@aa = (1 ..9), 将从1到9之间的自然数赋值给数组aa

9. pop/push
   从数组尾数弹出尾元素,原数组也相应减去未元素(栈操作)。
   @aa = (0 ..9);
   $1 = pop(@aa)    $1=9, @aa = (0 .. 8)
10.shift / unshift
   队列操作,从头开始弹出
   @aa = (0 .. 9)
   $1 = shift(@aa)  $1=0, @aa = (1 .. 9)
   空数组,弹出undef
11. 内插数组时候,如果是电子邮件格式@必须进行转义。
   $aa = "aaaa bbb is aaa\@com.xx ";
12. foreach:
   foreach $xx(列表)
      print $xx;
13. $_ 没告知perl使用那个变量时候,就默认使用$_ (系统默认)
   foreach (列表)
      print $_; 没告知是那个变量,所以就使用$_
14.reverse/sort
   @arr1 = sort @sort @arr2;
15.上下文:
   根据上下文,就是根据表达式前后的类型来自动转换,依前一个标量类型为准。 如:
   标量 = 列表  求列表内元素个数 (依照标量为准)
   列表 = 标量  将后标量赋值给前一个列表, 此时列表只有一个元素了 (依照列表为准)
16. 强制转换 (求复数元素个数)
   scalar @array

子程序
1. sub functionname
   {
    程序体;
    }
   调用此函数
   &functionname;
   &functionname(argu1, argu2...);  #(argu1,argu2 ..) 被存储在默认的@_的数组里面,在函数体进行处理时候,可以通过$_[0], $_[1] .. 依次类推。
2. 如果对实参的列表按顺序依次操作,则在函数体内使用 shift @_ , 当然@_可以省略
   $maximum = &max(3,5,2,4);
   sub max
   {
    my ($xx) = shift @_ ;  或 my $xx = shift; #实参列表的第一个元素,暂时看为最大
        foreach(@_)    
    {
          if($_ >$xx)
          {
        $xx = $_;
       }
     }
       $xx; # return $xx, 省略return
   }
3. my 局部变量:
   my ($aa) = @_ ; 参数列表第一个元素付给$aa, 相当于 ($aa) = @_ , 列表操作。
   my $aa = @_  ; 参数列表的元素个数付给$aa, 相当于 $aa = @_ , 标量操作。
   my($aa, $bb); $aa, $bb 都被声明;
   my $aa, $bb; 错误, $bb并没声明。
4. 重载系统的函数时候,必须加上&
   sub chomp
   { print "aaa \n"}
   &chomp; 一定加&, 因他同系统chomp同名。

输入/输出 < >
1. while(defined($line = <STDIN>))       == while(defined(<STDIN>))
   { print "$line is what i saw"; }       { print "$_ is what i saw!"; }
2. <> 行输入操作符号:
   aa.pl
   
   while(define(<>)) 或 while(<>)
  {
   chomp;
   print "line : $_ ";
   }
  
   ./aa.pl file1     #此时他就是读取file1的每一行,相当于将file1打印出来。
3. @ARG 命令参数数组,存储./aa.pl file1, file2 ... 里面的(file1, file2 ...)
   @ARG = qw ! aa bb cc !
   while(<>)
  {
   chomp;
   print " $_ is saw";
   }
4. 文件读写
   open CON, "file1";  打开文件
   open CON, "<file1"; 打开文件,读 (默认操作,效果同上)
   open CON, ">file1"; 写文件,覆盖
   open CON, ">>file1";写文件,追加
   常用操作:
   if(! open CON, ">>log")
     die "can't open log $!"; #$!存储异常信息。

5. close CON;

哈希
1. 值得访问:
   $hash{$key}
2. 这个哈希表 %
   my %hash = (
       "aa" => "ken",
       "bb" => "cath");
   $name = $hash{"aa"};  #$name = "ken";
3. hash操作
   keys 键的列表
   my @k = keys %hash   #所有键存入数组k
   my @v = values %hash #所有值存入数组v

   each 操作返回每对hash元素
   while( ($k,$v) = each %hash)
   print $k . "=>" . $v ;

   exists: 检测hash里面是否有某个键
   if(exists $hash{"lik"})
     print "lik has one ";

   delete 删除hash元素对
   delete %hash{$one};
4. %ENV
   操作系统环境变量
   如察看path
    print $ENV{PATH}



正则表达式
1. 任务:查看一个字符串,然后决定这个字符串是否有符号模板匹配的字符.
   如:
     grep 'aa.*bb' filename*.txt
     在filename1.txt, filename2.txt ...里面找到所有包含aa然后是 随意字符 然后是bb的行。
2. 模式 m// :m可以省略
   如果对$_(默认的标量)匹配,可以用 if(/xxx/), 不用if ($_ =~ /xxx/)
3. 元字符 “.”(一个字符的通配符,不能为空字符)
   表示任何单字符的通配符(除“\n"外)。

4. * 号表示,前一个字符或()中内容的0次或多次
   ab* 可以使ab, abb, abbbb
   abcd(ef)*cc 可以是abcdefcc, abcdefefcc, abcdefefefcc

   .* 表示任意个字符,常用来表示中间有不定的字符个数

   + 号表示, 前一个字符或内容一次或一次以上
   abcd+cc 可以是abcddcc,abcddddcc, 不能是abcdcc

   ? 号表示前一个字符或内容可有可无。
   abcd?cc  要么abcdcc要么abccc

5. 模式分组:用()将模式内分成n组,从1开始续增
   /(.)\1/ 匹配 bb, cc 等
   /y(.)(.)\2\1/ 匹配 yabba, yxyyx等
6. | 择一符号
  /aa( |\t)+bb/  aa后有空格或tab一个或多个,然后是 bb: "aa        bb"
7. 转义:
   \d :[0-9]          \D = [^0-9]    非数字
   \w:  [A-Za-z0-9]    \W = [^A-Za-z0-9] 非常规字符
   \t  tab
   \r  回车
   \s  空格, \s* 0个或以上空白   \s+ 至少一个空格  \S = [^ ] 非空格
8. 若不是默认匹配格式需要加m
   m!aa.*bb!  用!来标示模板,m不可省
   m/aa.*bb/i  i:大小写无关
   m/aa.*bb/s  s:匹配任意字符,包括\n (对"."匹配模式很有效,就是对多行都可以匹配)
   m/aa. * bb /x  x:去掉模式里面的空格

9. 锚定
   ^ 开头
   $ 结尾
   \b 单词边界  /\bken/  可以是aa kenddd cc    /ken\b/ : aa ccken dd  /\bken\b/ : aa ken cc  
10.比较奇怪的操作
   将一段字符串按照匹配分隔成三段,并分别存在默认的标量里面.
   $&  表示匹配的字符串
   $`  表示匹配字符串前面的字符串
   $'  表示匹配字符串后面的字符串
   "hello there, neighbor" =~ /\s(\w+),/
   $& = "there,";
   $` = "hello "; 这里hello后面有空格。
   $' = " neighbor"; 单词前面也有空格。

正则表达式文本操作
1. s/a/b/: 把a换成b
   s/a(.*)b/$1's/ 结果可能为:abb'sb   用$1,$2...代表()中内容。
   s///g: g表示全部更换
   \U:将其后面的所有都大写
   $_ = "i can say abc";
   s/(abc|ABC)/\U$1/gi; 结果:  $_ = "i can say ABC";

   \L:将其后所有字符都小写
   \u 和\l 只影响到其后的第一个字符,而不是其后所有字符
2. split:将字符串按照separator分隔为数组,很有用!!

   @fields = split /separator/, string;
   @arrary = split /:/, "a:b:c:d";   @arrary = (a,b,c,d);
   my @field = split  等价于 split /\s+/, $_;

3. join: 将数组按照指定字符串相粘结成一个字符串
   my $x = join ":", 2,4,5,7;  $x = "2:4:5:7";

    


 

TAG: Perl perl

 

评分:0

我来说两句

Open Toolbar