Perl 入門介紹(1)

來源:互聯網
上載者:User

 什麼是Perl?

   perl是一門免費及開源的指令碼語言,由Larry Wall所創造,這門語言以實用,快速開發為主要目標,

   與當前流行的物件導向,結構化編程有些格格不入。

   但是這並不妨礙perl被廣泛流傳和使用,世界範圍內圍繞Perl建立起了非常活躍的社區,

   很多人在其中不斷協助完善文檔,建立範例程式碼,提供一些第三庫等等。

   具體可以瀏覽以下兩個網頁:www.cpan.org , www.perl.com.

   perl最出名也最擅長的要數文本處理了,很多其它語言要花幾十上百行代碼才能完成的任務,

   perl可能只需要幾行代碼就能完成。但這些優勢也是有代價的,事實上Perl書寫代碼的風格有時常常被詬病,典型的面向過程式語言。

   還有就是,Perl一直以來所堅持的哲學:只要不引起衝突誤解,代碼可以寫成多種形式--There's More Than One Way To Do It

   這導致Perl在文法上具有非常鬆散隨意的特點,同一件事情常常有多種不同的寫法,有些看起來還很奇特,

   體現在文法上,Perl的符號特別多,讓Perl在一定程度比較難學易忘。

   本文主要簡單介紹一下Perl的基本文法,目的是通過本文,你能基本瞭解Perl的寫法,能夠順利的去讀別人的代碼。

   天下的語言在一定程度上是相通的,如果有一門語言的基礎,去學另一本語言,

   入門基本不會太難,但要用到熟,得心應手,第三庫的使用等,這些就需要耐心,假以時日了。

 

   本節主要介紹一下各種資料類型.

 

(一)語句及注釋:

     Perl語句以分號(;)結尾,用#作為一行的注釋,沒有其它語言中那種跨行的注釋。

     代碼塊用大括弧圍起來,這個和c類似。

     但這個大括弧在有些地方是強制要求,如在 if ,for,do, while等語句中。

     它不像其它語言一樣會用縮排來判斷塊。

(二) 變數:    標量(scalar) & 列表(list)

     Perl把簡單的資料類型,如字串,數字等“單數”的東西統稱為標量,與之相對的,就是“複數”的東西,如數組。

     標量的聲明都是$開始,如:  $str = "abc"

     多個標量也可以放一處一起聲明:

     ($x, $y, $z) = (11, 22, "no", 4);

 

     而數組的聲明則是以@開頭,如:@arr = ("abc","edf")

     Perl的變數聲明和很多其它指令碼語言一樣,不需要指明類型,直接聲明賦值就可以使用。

     如果只聲明但不賦值,Per會l預設給它賦值為:undef

     為了檢查一個變數是否已被賦值,Perl提供了一個操作符:defined 用於判斷一個變數是否已經被賦值。

     if( !defined( $myvar ) ) 

    {

       print "uninitialized variable";

    }

     

(三)字串

   (1)基本文法

    Perl中,所有字串都是雙引號或單引號括起來的,如: "string"  'string'.

    這兩種方式在很多時候相同,不同的是當字串出現其它變數或轉義符號的時候,雙引號會將變數的內容展開,而單引號的不會。

    這和shell script是相似的。

    如:

       $var = 234;

       $str1 = "str1:$var";    # 列印出來得到-> str1:234

       $str2 = 'str2:$var';     # 列印出來得到-> str2:$var

 

  (2)拼接

   點號(.)用於把字串進行拼接,這個和其它一些語言直接把字串連在一起就行不一樣。

   要用點號把字串連起來,如:

   $str = "abc"."efg";  # abcefg

   這個用法,和shell script , vim script是一致的。

    

  (3)比較

    這裡需要強調的,字串的比較要用:

  •     lt    小於 
  •     gt   大於 
  •     eq   等於

    而不要用== , >=  , <= ,這些符號是用來比較數實值型別的。

 

(四)數組

     (1)聲明

     如前所說,數組是一個複數(plaural)形式的變數,它的聲明是以@開頭的,後面跟著小括弧放入初始值。

     @arr = (12,34,56);

     同一個數組裡的元素類型不一定要一樣,下面的寫法也是合法的:

    @arr = (12,"abc",'c');

     也可以聲明空數組:

    @arr = ();

    聲明字串數組時,可以用q,qq,qw系列操作符簡化操作。q代表quoted,  qw代表: quotedword.

    @arr = qq(abc);   # 等價於 ("abc")

    @arr = qw(abc ef gg);   #等價於("abc","ef","gg")

    @arr = q(abc);    #等價於('abc')

 

    由上看出qq與qw的區別就在於,qq對將對括弧中的整個內容當成一個整體加上雙引號。

    而qw是以空格為分隔,如上面,對abc, ef, gg分別加上雙引號。

    q與qq相似。

    這幾個操作符的好處在於,當你想在字串加入轉義符號,引號等符號時,會方便很多。

    qq(\abc)  eq  “\\abc"

    qq("abc") eq ”\"abc\""

 

    (2)數組訪問,插入

    如果想訪問數組裡的元素,就用中括弧加下標的方法,和很多其它語言一樣,perl的數組元素從0開始算:

    print $arr[2];

    有人可能注意到了,引用裡面元素的時候,又用了$,而不是@。

    這裡其實有一個原則,用@時,是表示整個數組。

    引用其中的元素時,就用$。

    後面將講到hash類型數組,也是同樣的原則。

 

    Perl中的數組是沒有指定大小的,如果訪問了沒有定義的元素,就會返回undef

     @arr = (1,2,3);

     $ele = $arr[20]; # ele == undef

     如果要往數組中加入新元素,也可以直接用中括弧+下標

     $arr[4] = 4; #如果不存在第4個元素就插入,存在就覆蓋。

     

    (3)轉換

     下面提一個很體現 Perl風格的問題,前面說到,用@引用 一個數組時,表示對整個數組的引用,

     但這種引用在不同場合下(context)是表示不同含義的:

     @arr = ("abc", "ed");

     print "arr: @arr" ;

    上面的print會將arr 中的元素一個個的提取出來展開列印,這個好理解。

     但如果我這樣寫呢:

     $sz = @arr;  #

     把數組賦值給一個標量,Perl會把數組的大小賦值給左邊的變數。

     所以上面的例子裡,$sz等於2.

     如果Perl沒法判斷,當前上下文是標量還是數組,預設情況下,@arr都會展開數組裡的:

     @arr2 = (1,2,@arr);  # arr2 == (1,2,"abc","ed").

     但如果這時候,我是想讓@arr當作標量來處理的,怎麼辦?上面的寫法是不行的。

     Perl規定,如果想要指明轉換為標量類型,就需要加上關鍵字:scalar.

     @arr2 = (1,2,scalar @arr);  # arr2 == (1,2,2)

      

    (4)sort

        Perl為數組提供了排序操作符:sort

        預設情況下,sort對數組裡的元素按字母排序,然後返回一個新的數組,舊數組不變。

        @arr = ("abc","rsz","ef");

        @newarr = sort(@arr);

         #  arr = abc rsz ef    newarr = abc ef rsz.

         如果數組裡存的不是字元,或你不想按字元序排序, 可以指定按數位方式排序。

         sort ({$a <=> $b} @array) 

         大括弧表示一個比較函數,<=>是指數值比較,$a $b表示比較的兩個數,這兩個變數是語言預定義的變數不可以更改。

         如果把a,b的順序調換一下,就表示反過來排序。

         如果用了數值排序,而數組中又有字串元素,那字串都被當作0,如果有多個字串,字串之間仍按字母序來排序。

         如:  @arr = (22,44,33,-12,gg ,hh)

                 sort({$a<=>$b @arr);  #   結果:-12 gg hh 22 33 44

     

       (5)插入,刪除。 

          Perl提供了push,pop,shift,unshift等函數對數組進行入棧出棧之類的操作。

          push 和 pop作用在尾部,shift 與 unshift作用在頭部。

          @arr = ("ab","bc","ee");

          pop @arr;   # 結果:("ab","bc")

          push(@arr,"hh");  #結果: ("ab","bc","hh")

          shift @arr;   #結果:  ("bc","hh")

          unshift(@arr, "vv"); #結果: ("vv","bc","hh")

(五) hash 數組

     (1) 聲明與初化

      Perl裡的hash數組類似於python裡的dict, c++中的map。

      數組中儲存的是<key,value>一對值。

      hash數組用%來聲明。

     %hash = ("key1","value1","key2","value2");

     print "v1:$hash{key1}";  #列印出:value1.

     上面的初始化語句在key,value太多時可讀性很差。

      因此,Perl又提供了另一種寫法。

      %hash = ("key1"=>"value1","key2"=>"value2");

      其中符號 => 與逗號的效果是完全一樣,但這種寫法看起來,就比較容易分辨別哪個是Key,哪個是value.

     (2)插入,刪除與修改

         hash的插入與修改在文法上是完全一樣的。

         %hash{"key"} = "value";

         如果hash數組中原來沒有“key”,就插入,如果有"key"及相應"value",

         如果原來有相應的"key",就修改相應的value為新的“value".

 

         Perl提供了一個delete操作符來刪除hash中的元素。

         如: delete $hash{"key"};

 

      (3)擷取key與value.

          Perl提供了keys 和 values這兩個字來擷取hash中的全部key,value.這兩個人操作符返回的是一個數組。

          如: %hash = ("k1"=>"v1","k2"=>"v2");

                 @k = keys (%hash);    #k == ("k1","k2")

                 @v = values(%hash);   #v == ("v1","v2")

 

 

   本節主要介紹了Perl裡一些常用的資料類型,由上可以看出Perl的文法是非常簡單的,但細節較多。

   上手並不難,但要用熟,就要花些時間了。

   本文篇幅已經比較長,先到此為止,下一節,我將介紹一下基本的分支迴圈控制,函數等方面的內容。

   敬請期待。

    

        

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.