perl学习笔记(二)

来源:互联网 发布:linux c 文件路径 编辑:程序博客网 时间:2024/05/16 12:35
   Perl学习笔记2

 

 

1perlC语言的不同:

   A:整数与浮点数均被看作双精度浮点数。

   B:对于长的整数,perl用下划线来分隔,如:123456,可以表示为

123_456

   CperlNULL没有特殊的含义,不能靠null来判断字符串是否结束。

   Dperl变量,数组使用前无须声明,但函数使用前需要声明。

   E:空的控制语句如if,不能省略{ },而c语言可以。

   FperlBoolean类型,真假原则如下:

如值为数字,0false,其余为真。

如值为字符串,则空串(‘’)为false,其余为真。

特殊之处:perl0与‘0’相同对待。

   G:交换变量的值:

$fred$barney = $barney$fred),而C语言需要临时变量。

   H:数组直接拷贝:

       @copy = @quarry#将一个数组中的值拷贝到另一个数值中。

2:单引号双引号区别:

       单引号字符串中的/n不会被当作换行符来处理,其仅仅是两个字符/n。只有在反斜线/后面接的是/或单引号’时,其才会被当作特殊字符使用。

   串联操作符:.

   字符串重复操作符(string repetition operator):由小写的字母x表示,把操作符左边的字符串重复操作符右边数字那么多次数。

3perl warnings

   可以在命令行用-w参数打开警告:

      $perl –w my_program

   打开警告提醒的方法:

      UNIX#! /usr/bin/perl –w

      WINDOWS#! Perl –w

   获得更多的诊断信息:

      #! /usr/bin/pelr

      use diagnostics;   #diagnostics(诊断)

4:字符串变量知识:

        当一个字符串由双引号括起来时,如果变量前面没有反斜线,其变量值将被内插,即字符串中的变量被其值代替。

     其中:单独一个变量,引号没有意义。

        Print “$fred”;等价于print $fred;

5:字符串的比较运算符

       相等:   eq

       不等:   ne

       小于:   lt

       大于:   gt

       小于或等于:le

       大于或等于:ge

6 chomp操作:

    功能:去掉字符串结尾的换行符。

举例:chomp(#text =<STDIN>);#读入,但不含换行符

注:如结尾有两个或两个以上的换行符,chomp仅去掉一个。

7PopPush操作:对数组的末尾进行操作

   pop操作将数组的最后一个元素取出并返回。

   Push操作将一个元素或一列元素加在数组的结尾。

   形式如下:pop(数组变量)push(数组变量,添加的元素)

   举例:@array = 5..9

         $fred = pop(@array)#$fred得到9@array为(5678

         push@array,0;#@array变为(56780

   pop/push相似,shif/unshift操作符对一个数组的开头进行操作。

8标量与列表上下文(重点)

   上下文:即表达式存在的地方。

   标量与列表的区别:

   举例:  $fred = something;        #标量context

           @pebbles = something;    #列表context

           ($Wilma,$sjej) = something; #列表context

           ($fred) = something;       #列表context (注意与第一个区别)

       如在reverse,在列表context中,返回反转的列表;在标量context中,返回反转的字符串

   函数scalar:强制将列表context转换为标量context

9:定义子程序(subroutine):使用关键字sub,子程序的名字(无&这个符号)

    sub marine

    {

       $n+=1;

       print “Hello,sailor numners $n!/n”;

}

子程序调用的规则:计算每一步的值,返回子程序中最后计算的值

且子程序的定义是全局的。

子程序的调用方法:&marine;(*)

10:最大值程序:

$maximum = &max(3,5,10,4,6);

 

sub max

{

 my($max_so_far) = shift @_; //从参数数组@_中取出

foreach (@_)             //foreach循环遍历@_剩下的值

{

  if($_>max_so_far)      //循环中默认控制变量为$_,第一次循环$_5

  {

    $max_so_far = $_;

  }

}

$max_so_far;

}

创建私有变量的方法:my,如:my($m,$n);

my操作不会改变赋值残暑的context.

注:use strict #迫使程序采取严格的检测

11<>输入操作符:程序如下,

while(<>)

{

chomp;

print “It was $_ that I saw!/n”;

}

其中,chomp使用了默认参数,没有变量时,chomp将对$_操作。

      <>通常被用来处理所有的输入。

12:区别程序:

   打印数组与内插一个数组是不同的。

@array = qw /fred barney betty/;

 print @array;   #打印出元素的列表

 print “@array”; #打印一个字符串(包含一个内插的数组)

 第一个输出:fredbarneybetty

 第二个输出:fred barney betty(由空格分开)

13:当print调用的方法看起来是函数调用,它就是函数调用。

Print原则:

  print后面无括号时,print是一列表调用。

  print后面有括号时,print为函数调用,输出括号中的内容。

如:print (2+3)*4;

  表示:输出5,将print的返回值1乘以4,结果被丢弃。

14:数组与printf

my @items = qw( Wilma dino pebbles);

my $format = “The items are:/n”.(“%10s/n”x@items);

printf $format,@items;

等价于:

printf “The items are:/n”.(“%10s/n”x @items),@items;

其中,@items使用了两次,一次在标量context中,取其元素的个数;一次在列表context中取元素。

注:x操作符:确定字符串要重复的次数

15文件句柄(filehandle):是程序I/O连接的名字,不是文件的名字。

Perl自带了六个文件句柄:STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUT

文件句柄的打开:

open CONFIG,”dino”

   打开名为CONFIG的文件句柄,指向dino文件。默认是输入。

open CONFIG”<dino”;

   功能同上,<明确指明:使用这个文件进行输入操作。

open BEDROCK,”>fred”;

   打开文件句柄BEDROCK,输出到新文件fred中。

open LOG,.”>>logfile”;

   >>打开一个文件,数据追加到文件后面。

Perl 5.6版本以后支持三参数的文件格式:

Open CONFIG,”<”,”dino”;

Open BEDROCK,”>”,$file_name;

16:关闭文件句柄:

close BEDROCK;

die函数:

die函数创建自己的严重错误,打印出给定的错误信息,die自动将程序的名字和行数输出在消息的末尾。

If(!open LOG,”>>logfile”)

{

 die “Cannot create logfile:$!”;

}

注:其中的$!指系统产生的一些可读的信息。

Select操作符:改变默认的输出句柄。

注:关于文件句柄的重新打开,只有perl成功的重新打开新的连接,否则不会关闭以前的连接。

17哈希(hashes

哈希元素的提取:

$hash{$some_key}

注:此处下标(key)使用的是花括号{},key的表达式是字符串,而不是数字,key必须是唯一的。

  引用整个hash:使用%号作为前缀。

  Hash的值(在列表context)是一个key/value对的列表。

  大箭头符号:(=>,用于识别keyvalue

    举例:my %last_name =

{

  “fred” => “flintstone”,

   “betty” => “rubble”,

}

18:哈希函数:

Akeysvalues函数

   Keys返回此hash中所有的keysvalues函数返回所有的values.

   My %hash = (“a”=>1,”b”=>2,”c”=>3);

   My @k = keys%hash;

   My @v =values%hash;

   在标量context中:

    my $count = keys%hash;#返回hash中元素的个数。

Beach函数(通常用在while循环中)

   While(($key,$value) = each %hash)

{

   print “$key =>$value/n”;

}

Cexists函数:查看hash中是否存在某个key

   If(exists $books{$dino})

   {

     print “Hey,there’s a libaray card for dino!/n”;

   }

Ddelete函数:从hash中删除某个key

    My $person = “betty”;

    Delete $books {$person};#$person的借书卡删除掉

Ehash元素的内插:用于在双引号的字符串中使用单个元素。

   Foreach $person (sort  keys %books)

   {

     if($books{$person})

      {

        print “$person has $books{$person} items/n”

}

   }

19:正则表达式(regular Expessions):在perl中也称为模式(pattern.

注:andor在正则表达式中不是操作符,仅仅是个单词。

(.)通配符:可以匹配任何单个的字符,不包括换行符(“/n”.

*:表示匹配前一字符0次或者多次。

.*:能匹配任何字符串(除了换行符)。

+:可以匹配前面的字符一次或多次。

?:匹配前面的字符一次或0次。

|(竖线):匹配左边或右边的。

[]:匹配括号内出现的任意单个字符。

/d:任意数字的类,[0-9]

/w:称为word字符,[A-Za-z0-9],注/w不能匹配单词,只能匹配单个字符,

   word由字母,数字。下划线组成。

/s:匹配空白(whitespace),等价于:[/f/t/n/r]

20:正则表达式中可选的修饰符:

/i:不区分大小写

/s:匹配任何字符

/x:添加空格

/b:词界锚定,针对单词的。

=~:绑定操作符,告诉perl将右边的模式在左边的字符串上进行匹配,而不是对$_匹配。

 如:print “Do you like Perl?”;

     my $likes_perl = (<STDIN> =~//byes/b/I); #括号可以省去,=~优先级高

      ……  #Times passes…

      if($likes_perl)

      {

         print “You said earlier that you like Perl,So…/n”;

}

匹配变量:

   $_ = “Hello there,neighbor”;

   if(//s(/w+),/)    #匹配空格和逗号之间的词

  {

    print “the world was $1/n”;#the world was there

}

21perl中提供的三个自动匹配的变量:$&,$`,$

如:if”Hello there,neighbor” =~//s(/w+),/

    {

      print “That was ($`)($&)($')”;

}

输出的消息为:(Hello(there,)(neighbor).

其中:$&保存整个被匹配的部分,$`保存匹配部分的前一部分。

      $'保存匹配部分的后一部分。

22: 正则表达式处理文件

    全局替换:

$_ = home,sweet home!”;

s/home/cave/g;

print “$_/n”; #cave,sweet cave!”;

其他举例:

  s//s+/ /g; #将多个空格用单个空格代替。

  s/^/s+//;  #将开头的空白去掉

  s//s+$//;  #将结尾的空白去掉

  s/^/s+|/s+$//g; #去掉开头结尾的空白

大小写转换:

   $_ = “I saw Barney with Fred.”;

   s/(fred|barney)//U$1/gi;  #$_现在是:I saw BARNEY with FRED.

   /U:转换大写

   /L:转换小写

   /u/L:第一个字符大写,其他字符均小写。

23加号的非贪婪类型是:+?,星号的非贪婪类型是:*?

贪婪类型是:.+         贪婪类型是:.*

更新文件:

#! /sur/bin/perl –w

use strict;

 

chomp (my $data =‘date’);

#获取系统的当前时间,更好的方法是localtime函数

# my $date = localtime;

$^I = “.bak”;

 

while(<>)

{

  s/^Author:.*/Author:Randal L. Scharwartz/;

  s/^Phone:.*/n//;

  s/^Date:.*/Date:$date/;

  print;

}

24perl控制语句:

unless:除非条件为真。

elsif:注意只有一个e

next:结束本次循环,进行下一次循环。

redo:继续执行本次循环

last:立及结束循环,等同于C语言中的break语句。

Perl实现了C中所有的操作符

举例:?:三目运算符,利用?:编写分支程序小技巧:

  my $size =

      ($width<10)?”small”:

      ($width<20)?”medium”:

      ($width<50)?”large”:

          “extra_large”; #default

25:文件检验

文件检验操作:

如:die “Oops! A file called ‘$filename’ already exists./n”

      if –e $filename;

    # -e选项检测是否存在相同名字的文件。

其他常见的选项有:

   M:修改的时间

    -T:文本文件

   B:二进制文件

   A:访问的时间

   s:文件或目录存在,大小大于0(值为文件的大小,字节)

例:将文件移动备份磁带

    my @original_files = qw/ fred barney betty Wilma pebbles dino 

                             bam-bamm/;

    my @big_old_files;

    foreach(@original_files)

    {

       push @big_old_files,$_

         if (-s)>100_100 and –A_>90;#比下面的效率高

         #第一次检测使用了默认的变量$_.

         #第二次检测使用_这个文件句柄。

         #if –s $filename >100_100 and –A$filename >90;

}

26:目录操作:

chdir:改变工作目录(等价于Unix中的cd)

   chdir “/etc” or die “cannot chdir to /etc:$!”;

globbing:将文件名模式转换成它所匹配的文件名

   my @all_files = glob “*”;

   #@all_files得到了当前目录下的所有文,安字母排序,不包括由点.开头的文件

   等价于Unix中的echo命令

目录句柄:

   打开:Opendir,读:readdir.关闭:closedir

删除文件

   unlink,删除文件(Unix中用rm删除文件)

   unlink glob “*.o”;

    #删除所有文件后缀为.o的文件,unlink返回值为成功删除的文件数。

重命名文件:

   rename,(Unix中用mv命令)

   rename “old”,”new”;

连接与文件:

   link函数。创建一个新的连接。

创建删除目录:

   mkdir,创建新目录。

      Mkdir “fred”,0755 or warn “cannot make fred directory:$!”;

       #0755,表示目录设置的初始权限。

   rmdir:删除目录

修改权限:

   chmod,与Unix相似

   chmod  0755,”fred”,”barney”;

      #chmod返回其成功改变的个数。

改变所有者:

   chown:改变一批文件的所有者及所在的组。

   如:My $user = 1004;

       My $group = 100;

       Chown &user,$group,glob “*.o”;#两者同时修改

改变时间戳:

   utime函数

   my $now = time;

   my $ago = $now-24*60*60;

   utime $now,$ago,glob “*”;

 

27:字符串与排序

使用索引寻找字串

  $where = index($big,$small);

#返回第一个字符的位置,字符位置从0开始。

  rindex:返回字符最后一次出现的位置。

使用substr操作字串

  $part = substr($string,$initial_position,$length);

  三个参数:一个字符串,一个从0开始编号的初始位置,以及字串的长度。

           返回一个子串

  my $mineral = substr(“Fred J.Flintstone”,8,5);

          #得到”Flint”

  my $long =”some very long string”;

 my $right = substr($long,index($long,”l”));

      #返回字符串中字母l后的子串

 继续举例:

  my $string = “Hello,world!”;

  substr($string,0,5) = “Goodbye”;

  #$string现在变为“Goodbye,world!”;

substr($string,-20) =~s/fred/barney/g;

   #将字符串最后20个字符串中的fred改为barney