乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      【轉(zhuǎn)載】從C到Perl

       royy 2012-05-06

      【轉(zhuǎn)載】從C到Perl

          很多人并不是把Perl當做第一門編程語言來學習的,在學Perl之前往往已 經(jīng)掌握了一兩門其它語言。雖然有爭議,但是我個人認為Perl確實不適合作為入門語言。這篇文章就是寫給那些熟悉C而且又想掌握Perl的程序員,介紹一 些技巧以及如何避免C程序員常犯的錯誤,帶你渡過危險的沼澤。在讀這篇文章之前,請先查看perltrap的手冊頁,里面有很多有用的信息,這里不再重 復。歡迎來到Perl的魔法世界!

      如果你喜歡C,那你也會愛上Perl。

          C語言的設計者Dennis Ritche說:“C語言詭異離奇,缺陷重重,卻獲得了巨大的成功。 ”這大概是因為C的抽象程度碰巧既滿足了程序員的要求, 又容易實現(xiàn)。鐘愛C的人都樂意寫一些稀奇古怪的C程序,并以此展示自己的才能。Perl在這方面更可謂是“有過之而無不及”。 Perl丑陋而又抽象,完全可以用來寫混亂代碼,但它又靈活實用,而且更接近自然語言,也可以用來寫詩。這本身就很有意思。在C擅長的底層領域,Perl 只能望塵莫及,畢竟它天生不是用來和硬件打交道的。但在文本處理領域,C只好俯首稱臣了,而Perl在這方面非常強大。據(jù)說,Perl也得到了很多生物學 家的青睞,在很大程度上幫助了人類基因組計劃。謝謝Larry Wall!

      給C程序員的提示

          Perl結(jié)合了多種編程語言的特性,C語言也在其中。Perl和C有以下相同之處:

      • 1.分號是每個簡單語句必需的,換行不能表示語句結(jié)束。
      • 2.數(shù)組下標也是從0開始,Perl中像substr這樣的字符串函數(shù)也是從0開始計算位置的。
      • 3.逗號操作符的作用一樣。
      • 4.&&和||操作符作用一樣。 
        然而,Perl和C畢竟是兩種完全不同的編程語言,從C轉(zhuǎn)向Perl有很多值得注意的地方。我們在下面詳細討論。

       

      1.變量的類型由它前面的符號確定

          這不是說Perl使用的是匈牙利表示法,而是Perl的特性。在Perl中,$說明變量是一個 scalar,@表明變量是一個array,而%說明后面的變量是一個hash。比如:@foo是一個數(shù)組,而$foo[0]是數(shù)組@foo中第一個元 素,@foo[0]是一個數(shù)組片段,當然也是數(shù)組,但這個片段只有一個元素$foo[0]。如果你數(shù)組變量把賦給一個標量,比如:$bar=@foo;, 你將得到的是該數(shù)組中元素的個數(shù)。

      2.沒必要提前聲明一個變量

          在C中你每引入一個變量,都要在前面聲明它的類型。在Perl中完全沒有必要,你可以在任何時候任意引 入新的變量。不過,問題就出來了,你可得當心。如果你不小心敲錯一個字母,Perl會把它當成你新引入的變量,并且自動初始化,有時不會給出任何錯誤提 示,而這顯然與你的最初目的不符!所以,最后在每個Perl程序的前面都加上use strict;,確保perl能對代碼進行更嚴格的檢查,就像你使用lint檢查C程序那樣。

      3.沒有類型轉(zhuǎn)換

          Perl中的標量類型范圍很廣,可以是整數(shù),可以是字符串,也可以是浮點數(shù)。你可以很安全地把一個整數(shù) 默默地轉(zhuǎn)化成相應的字符串。Perl解釋器能夠理解你的意思,不用擔心。但是,這并不是說任何時候你都可以高枕無憂,把字符串“轉(zhuǎn)化”成整數(shù)時,你確實得 下一番功夫。我們在下面將會討論這個問題。

      4.沒有字符類型

          Perl中沒有char這種類型。

      $ch='c';

          上面的語句其實是給標量$ch賦了一個字符串值,因為Perl中單引號也能括起字符串(對比單引號和雙引號的不同留做練習)。正因如此,才使得把字符串轉(zhuǎn)化成整數(shù)或者浮點數(shù)變得稍微麻煩了些。我們可以這樣這樣處理字符:

      @array = split(//, $string);      # each element a single character
      @array = unpack("C*", $string);   # each element a code point (number)
      

          當然也可以使用正則表達式。Perl中也有類似atoi()的函數(shù),叫作POSIX::strtod,在POSIX模塊中,使用前應該先包含它。

       

      5./不是整除

          由于Perl中沒有整數(shù)和浮點數(shù)類型的區(qū)分,所以當你想按照C的意思用/操作符表示整除時,它并非你想要的。實際上/在Perl中是浮點除法,下面的程序是危險的:

      while($a/=2)
      {
      push @tmp, $a % 2;
      }
      

          它會把$a精確地除到小得Perl無法表示它!如果你想表示整除,請將整個表達式放入int函數(shù)中。

       

      6.再談數(shù)組

          當心:在Perl中只有hash是使用{}初始化的,普通數(shù)組array是使用 ()進行初始化的!使用{}給普通數(shù)組賦值解釋器會報錯。而且,Perl中的數(shù)組是可以任意伸縮的,不存在數(shù)組越界問題。不像C,Perl允許有匿名數(shù)組/散列/子函數(shù),比如使用匿名數(shù)組交換兩個變量的值:

      ($var1, $var2) = ($var2, $var1);

          Perl數(shù)組脫離了底層特性,而且更加靈活方便。

       

      7.沒有switch

          這實在是讓C程序員們吃驚,Perl居然沒有switch。的確,Perl并不需要switch ,因為switch完全可以用if/elsif/else(注意:是elsif而不是else if)或者?:來代替。Perl中的switch可以這樣來寫:

      SWITCH: {
      if ($value == 1) { print "One" };
      if ($value == 2) { print "Two" };
      if ($value == 3) { print "Three" };
      if ($value > 3) { print "Unknown" };
      }
      #Or like this:
      SWITCH: {
      $value == 1 and print "One", last;
      $value == 2 and print "Two", last;
      $value == 3 and print "Three", last;
      print "Unknown";        #default
      }
      
      

          當然你也可以使用goto,畢竟TMTOWTDI(There's More Than One Way To Do It.)。

      • //這里有問題,因為7在5.8中實現(xiàn),而且很強大.是用模塊來實現(xiàn)的 

       

      8.沒有struct和union

          如果你決定使用Perl編程,那么你可以完全繞開struct這類東西。union 是更為底層的東西,更不應該出現(xiàn)在Perl中。如果你想用struct實現(xiàn)數(shù)據(jù)結(jié)構(gòu),比如單鏈表,那么在Perl 中你可以選擇hash和reference。其實hash可以實現(xiàn)很多數(shù)據(jù)結(jié)構(gòu),更詳細的內(nèi)容見《Mastering Algorithms with Perl》一書。如果你想用struct實現(xiàn)class,那么你可以使用Perl中的object。最后,如果你說:“我不用struct完成不了這個程序”,那你怎么不考慮用C而用Perl呢?

      9.沒有懸空的else

          Perl中的條件和循環(huán)語句塊都需要用{}括起來,因此也就不存在懸空的else問題。記住:塊(block)本身就相當于一個只執(zhí)行一次的循環(huán),因此last對block也起作用。有點例外的情況是當條件判斷出現(xiàn)在一條語句的最后時,前面沒必要加花括號。比如:

      if $test print "yes";    #This one is WRONG!
      {print "yse"} if $test;  #WRONG again!
      print "yes" if $test;    #This one is right.
      

       

      10.不一般的do

          do在Perl中被賦予三種不同的含義。當它后面是一個block時,它會把后面塊中的語句都執(zhí)行一 遍,并且返回最后一個表達式的值;如果它和while或者until連用,Perl會通過測試條件來決定執(zhí)行塊中的語句,但是,塊中的語句不會被計算在循 環(huán)之中。所以,使用last/next/redo來控制塊是沒用的。當它后面是一個文件名時,它的作用是把名為此的文件包含進來。當它后面是一個子函數(shù) 時,它是對后面子函數(shù)的調(diào)用,但這是一種不推薦使用的方式。

      11.沒有內(nèi)存泄漏

          你再也不用擔心free和malloc函數(shù)造成內(nèi)存泄漏了,因為在Perl中沒有那種函數(shù),也沒有指 針,你幾乎不用關(guān)心內(nèi)存分配問題。Perl中類似指針的reference,沒有底層的那些特性。實際上,在Perl中造成內(nèi)存泄漏是很罕見的。你再也不 用害怕字符串空間不夠用,字符串是否以'\0'結(jié)尾這種問題了,Perl中的字符串像 C++中的String類一樣方便,就是沒有C++重載運算符帶來的連接和比較字符串的實惠(Perl也可以重載運算符,在這里不討論)。

      12.函數(shù)參數(shù)

          Perl被設計成與自然語言很接近的計算機語言,這也就無怪乎用Perl也能寫出詩來了。函數(shù)參數(shù)不必都用圓括號括起來。雖然加上圓括號也沒什么影響,但是你得知道,不加括號可以讓你的程序更易讀,更優(yōu)雅。試比較下面的語句: 

      open (YOUREYES, $wide) or die ("$!");
      open YOUREYES, $wide or die $!;

          這是Perl,放輕松點兒。更進一步,如果你不想轉(zhuǎn)遞給函數(shù)任何參數(shù),不用帶多余的圓括號;但是如果你也想同樣處理你自己寫的子函數(shù),你必須在使用之前就定義或者聲明那個函數(shù)。

          此外,Perl很好地支持可變參數(shù),而且Perl傳遞函數(shù)參數(shù)實際上是引用傳遞,而不是像C那樣采用值傳遞!換句話說,你對@_中的元素進行修改,那么相應的實參也會變化。Perl采用這種方法可以很容易地返回所需要的值。

      13.函數(shù)原型

           Perl中的函數(shù)原型是調(diào)用環(huán)境中的自動模板,而不像C中的那樣。而且函數(shù)原型只影響那些不帶&方式調(diào)用的函數(shù)。你必須十分注意函數(shù)原型是否將你 的子函數(shù)帶入了一個新的環(huán)境。因此,“最好在新函數(shù)中使用函數(shù)原型,但別在舊函數(shù)中使用函數(shù)原型?!比绻悴恍⌒?,你可能因函數(shù)原型遇到很多麻煩。但如果 你非常謹慎,你可以用函數(shù)原型出色地完成任務。

      14.沒有main函數(shù)

          C家族的語言都必須有一個main函數(shù),而Perl不在其中。和Basic類似,Perl也沒有 main函數(shù),自頂向下解釋執(zhí)行。Perl中命令行界面的參數(shù)是通過@ARGV數(shù)組傳遞的,而且沒有$ARGC變量,因為把@ARGV賦給一個標量就能得 到參數(shù)個數(shù)。不過,Perl中的$ARGV[0]相當于C的argv[1],相當于argv[0] 的變量是$0。C中環(huán)境變量是通過main的參數(shù)char** env傳遞的,而Perl通過%ENV散列。

      15.不一樣的左值

          Perl中所有可能是左值的東西都可以作為左值。比如,如果?:操作符的兩部分表達式都是左值,那么整 個表達式也可以是左值。函數(shù)也可以是左值,若substr函數(shù)的第一個參數(shù)運算后是可修改的,它也可以用作左值。你也可以把自己的子函數(shù)定義成可以作為左 值使用的,是的,Perl允許你這么做。就像這樣:

      my $val;
      sub canuse : lvalue {
              $val;
              }
      canuse() = 9;
      

          它可以很安全地把右值賦給$var。

       

      16.隱含變量/參數(shù)

          Perl的一大特點就是它有很多預定義好的變量,它們都有各自專門的用途,這和C大不相同。你必須熟悉 它們才能駕馭它們。$_可能是最常用的隱含變量了,它是輸入和模式匹配中默認的變量/參數(shù);@_是用于傳遞子函數(shù)參數(shù)的列表;$!保存著最近一次系統(tǒng)調(diào)用 的錯誤信息(相當于C中的errno)…… 還有很多其它。隱含變量雖然看起來有點古怪,但當你熟悉它后,它能給你節(jié)省很多時間,增加程序的可讀性。

          當然,Perl的魔力和魅力遠不止如此。Perl有著自己獨特的風格,散發(fā)著自己的光芒。你應該用心去尋找Perl中的pearl!愿你也能用Perl創(chuàng)造更多的奇跡,更多的藝術(shù)!

      參考資料

      1.《Programming Perl, Third Edition》

      2.《Professional Perl Programming》

      3.《Perl Debugged》

      4.《The C programming Language, Second Edition》

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多