Perl 入門介紹(1)


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 會默認給它賦值為: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 代表: quoted word.

     @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類型數組,也是同樣的原則。上面是一次訪問一個元素,如果需要取出 sub array(切片), 則應如下寫:

     @sub_arr = @arr[1,4];

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 的語法是非常簡潔直接的,但細節較多,上手並不難,但要用熟就要花些時間了。        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM