perl學習筆記(二)

   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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章