久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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

 royy 2012-05-06

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

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

如果你喜歡C,,那你也會(huì)愛(ài)上Perl,。

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

給C程序員的提示

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

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

 

1.變量的類(lèi)型由它前面的符號(hào)確定

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

2.沒(méi)必要提前聲明一個(gè)變量

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

3.沒(méi)有類(lèi)型轉(zhuǎn)換

    Perl中的標(biāo)量類(lèi)型范圍很廣,,可以是整數(shù),,可以是字符串,也可以是浮點(diǎn)數(shù),。你可以很安全地把一個(gè)整數(shù) 默默地轉(zhuǎn)化成相應(yīng)的字符串,。Perl解釋器能夠理解你的意思,不用擔(dān)心,。但是,,這并不是說(shuō)任何時(shí)候你都可以高枕無(wú)憂(yōu),把字符串“轉(zhuǎn)化”成整數(shù)時(shí),,你確實(shí)得 下一番功夫,。我們?cè)谙旅鎸?huì)討論這個(gè)問(wèn)題。

4.沒(méi)有字符類(lèi)型

    Perl中沒(méi)有char這種類(lèi)型,。

$ch='c';

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

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

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

 

5./不是整除

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

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

    它會(huì)把$a精確地除到小得Perl無(wú)法表示它!如果你想表示整除,,請(qǐng)將整個(gè)表達(dá)式放入int函數(shù)中,。

 

6.再談數(shù)組

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

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

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

 

7.沒(méi)有switch

    這實(shí)在是讓C程序員們吃驚,,Perl居然沒(méi)有switch,。的確,Perl并不需要switch ,,因?yàn)閟witch完全可以用if/elsif/else(注意:是elsif而不是else if)或者?:來(lái)代替,。Perl中的switch可以這樣來(lái)寫(xiě):

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
}

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

  • //這里有問(wèn)題,因?yàn)?在5.8中實(shí)現(xiàn),而且很強(qiáng)大.是用模塊來(lái)實(shí)現(xiàn)的 

 

8.沒(méi)有struct和union

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

9.沒(méi)有懸空的else

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

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

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

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

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

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

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

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

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

13.函數(shù)原型

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

14.沒(méi)有main函數(shù)

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

15.不一樣的左值

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

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

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

 

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

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

    當(dāng)然,,Perl的魔力和魅力遠(yuǎn)不止如此。Perl有著自己獨(dú)特的風(fēng)格,,散發(fā)著自己的光芒,。你應(yīng)該用心去尋找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》

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多