perl

perl

Perl是一種高級、通用、直譯式、動態的程式語言。最初的設計者為拉里·沃爾(LarryWall),他於1987年12月18日發表。Perl借取了C、sed、awk、shellscripting以及很多其他程式語言的特性。其中最重要的特性是它內部集成了正則表達式的功能,以及巨大的第三方代碼庫CPAN。簡而言之,Perl像C一樣強大,像awk、sed等腳本描述語言一樣方便,被稱之為“一種擁有各種語言功能的夢幻腳本語言”、“Unix中的王牌工具”。Perl一般被稱為“實用報表提取語言”(PracticalExtractionandReportLanguage),你也可能看到“perl”,所有的字母都是小寫的。一般,“Perl”,有大寫的P,是指語言本身,而“perl”,小寫的p,是指程式運行的解釋器。

基本信息

引言

Perl最初只是Unix系統管理員的一個工具,在工作日裡被用在無數的小任務中。從那以後,它逐步發展成為一種全功能的程式設計語言,特別是在各種計算平台上,它被用作Web編程、資料庫處理、XML處理以及系統管理——它能夠完成所有這些工作,同時仍然是處理小的日常工作的完美工具,這是它的設計初衷。Perl快速、有趣,而且特別有用。很多人因為需要Perl而使用它,又因為熱愛它而繼續使用它。
Perl是一門自由且功能強大的程式語言。自1987年初次登台亮相以來,它的用戶數一直急劇膨脹。從最初被當作一種在跨平台環境中書寫可移植工具的高級語言開始,Perl就已經被廣泛地認為是一種工業級的強大工具,可以在任何地方用來完成你的工作。Perl特別適合系統管理和Web編程。Perl實際上已經被所有Unix(包括Linux)捆綁在一起作為標準部件發布,而且也被廣泛用於MicrosoftWindows和幾乎所有其他作業系統。Amiga、BeOS、VMS、MVS和AppleMacintosh等也只是Perl已經完成移植的平台的一小部分。

概述

Perl原名pearl,但是在這個語言官方發表前,拉里·沃爾發現已經有個程式語言“pearl”,便將這個程式語言的名字改成Perl。對於Perl這四個字母,有一些解釋,包括充滿幽默感的“PathologicallyEclecticRubbishLister”。“PracticalExtractionandReportLanguage”曾經出現在很多有關Perl的數據里,包括官方的首頁。不過事實上這個長名字是後來湊出來的。它的名字第一個字母大寫(Perl)時就指這個程式語言,無大寫字母(perl)時就指它的解釋器。將Perl寫成“PERL”是不適當的,因為它並非一個縮寫字。

程式語言

Perl是由LarryWall設計的,並由他不斷更新和維護的程式語言。
Perl具有高級語言(如C)的強大能力和靈活性。事實上,你將看到,它的許多特性是從C語言中借用來的。
Perl與腳本語言一樣,Perl不需要編譯器和連結器來運行代碼,你要做的只是寫出程式並告訴Perl來運行而已。這意味著Perl對於小的編程問題的快速解決方案和為大型事件創建原型來測試潛在的解決方案是十分理想的。
Perl提供腳本語言(如sed和awk)的所有功能,還具有它們所不具備的很多功能。Perl還支持sed到Perl及awk到Perl的翻譯器。
簡而言之,Perl像C一樣強大,像awk、sed等腳本描述語言一樣方便。

特點

Perl的解釋程式是開放源碼的免費軟體,使用Perl不必擔心費用。Perl能在絕大多數作業系統運行,可以方便地向不同作業系統遷移。
Perl是一種能完成任務的語言。從一開始,Perl就設計成可以把簡單工作簡單化,同時又不失去處理困難問題能力的語言。它可以很容易運算元字,文本,檔案和目錄,計算機和網路,特別是程式的語言。這種語言應該很容易運行外部的程式並且掃描這些程式的輸出獲取感興趣的東西。而且它還應該很容易能把這些你感興趣的東西交給其它程式做特殊的處理。當然,這種語言還應該很容易在任何現代的作業系統上可以移植地編譯和運行。

基本語法

變數定義,以$號開頭,如:$num=1;
數組定義,以@開頭,如:@array=(1,2,3);
數組元素調用@array[index],其中index表示數組下標,如上例,@array[0]的值是1;
散列定義,以%開頭,如:%hash=("a",1,"b",2);
散列調用%hash,其中keys表示鍵值,多用字元串表示,注意hash的key必須具有唯一性,但value可以不唯一,為此hash的key經常被用來做唯一化處理,如上例中的"a","b",values是keys對應的值,如1,2。%hash{"b"}的值是2。

優點

perl處理示例perl處理示例
Perl追求的是簡單,解決一個一般的問題用它幾行代碼就完成了。一個稍複雜一點的問題代碼也不會超過一屏!在軟體測試中,Perl通常是非常重要的角色。一般一個測試通用函式館就要分十幾個檔案,甚至更多,包含多達上千個定製功能。而這些函式將在主函式運行時,不定數量的被調用。幾乎可以說,一切自動過程都是由Perl自己完成的,可見其功能的強大和在當今計算機技術高速發展的時期仍然發揮著重要的作用。Perl最初是當做一種Unix的腳本語言設計的,但是它早就移植到大多數其它作業系統里了。因為Perl幾乎可以在任何地方運行,所以Perl可以說是當今最具有移植性的編程環境;要想寫可移植的C/C++程式,你得在程式里加上一大堆#ifdef標籤來區分不同的系統;要想寫可移植的Java程式,你必須理解每種新的Java實現的特質;要想寫可移植的shell,你可能要記住每條命令在每種作業系統上的語法,走運的時候你可能可以找到一些公共的東西;要想寫可移植的VisualBasic程式,需要對“移植”有個更靈活的定義。讓我們很高興的是Perl避免了所有這些問題,同時還保留了這些語言中的許多優點,同時還有一些自己的特色。Perl的特色來自許多方面:它的特性集的工具,Perl社區的創造性,以及開源運動的大環境。不過,許多這些特性都是混合的東西;Perl的身世複雜,它總是把事物看成是優點的不同方面,而不是弱點。
Perl是“背黑鍋我來”的語言。如果你覺得自己陷入一團亂麻之中,非常渴望自由,那么請使用Perl。Perl是跨文化的。Perl的爆炸性增長很大程度上是因為那些前Unix系統程式設計師的渴望,他們希望從他們的“老家”帶著儘可能多的東西。對於他們而言,Perl是可移植的Unix文化蒸餾器,是"此路不通"的沙漠中的綠洲。從另外一個角度來看,Perl還可以從另外一個方向運轉:在Windows上工作的web設計者通常會非常開心地發現他們的Perl程式可以不加修改地在Unix伺服器上跑。儘管Perl在系統程式設計師和web設計師中間非常流行,但這只是因為是他們最早發現Perl的,Perl可以用於更廣泛的用途。從Perl最早的文本處理語言開始,它已經發展成為一種非常複雜的,通用的程式語言,以及完整的開發環境,包括調試器,調節器,交叉引用,編譯器,庫,語法提示編輯器,以及所有其它“真正”的程式語言所具有的所有掛勾,只要你需要。當然這些東西都是讓我們可能處理難的問題的東西,而且很多其它語言也可以做到這一點。
Perl之所以成為Perl是因為它從來不會因為保持簡單事情簡單化而丟失其他方面的特性。因為Perl既強大又好用,所以它被廣泛地用於日常生活的方方面面,從宇航工程到分子生物學,從數學到語言學,從圖形處理到文檔處理,從資料庫操作到網路管理。很多人用Perl進行快速處理那些很難分析或轉換的大批量數據,不管你是處理DNA序列,網頁,還是豬肚皮的未來都無所謂。實際上,在Perl社區有一個笑話就是,下次股市大崩盤就很有可能是哪個傢伙寫的腳本裡頭有bug造成的。(不過,樂觀點來看就是,任何還在失業的股票分析師仍然有可以利用的技巧。)Perl的成功有許多原因。Perl早在開源軟體的名字出現之前就已經是一個成功的開源項目了。Perl是自由的,並將永遠自由下去。你可以在任何合適的場合使用Perl,只需要遵守一個非常自由的著作權就可以了。如果你在從事商業活動並且還想使用Perl,那么用就是了。你可以把Perl嵌入到你寫的商業軟體中而不需要支付任何費用也沒有任何限制。如果你碰上一個Perl社區解決不了的問題,那你也還有最後的一招:源程式本身。Perl社區不會在“升級”的偽裝下租給你它們的商業秘密。而且Perl社區也不會“停業”,更不會讓你孤立無援。Perl是自由軟體這一點無疑對它是有幫助的。但這一條並不足以解釋Perl現象,因為許多自由軟體包沒有能繁榮起來。Perl不僅自由;而且好玩。人們覺得自己在Perl里可以有創造力,因為它們有表達的自由:他們可以選擇是為計算機速度最佳化還是為程式設計師的速度最佳化,是冗長還是簡潔,是選擇可讀性還是可維護性,或者選擇復用性,移植性,接受性和傳授性等等。假如你進入一次模糊的Perl比賽,甚至你還可以為模糊性做最佳化。Perl可以給予你所有這些自由,因為它是一門有著分裂人格的語言。Perl同時是很簡單並且很富有的語言。Perl從其它地方拿來好主意,然後把它們安裝到易用的框架裡面。對於只是喜歡她的人來說,Perl是實用抽取和報表語言(PracticalExtractoinandReportLanguage)。對那些熱愛她的人而言,她是變態電子垃圾製造者(PathologicallyElectricRubbishLister)。在少數人眼裡,Perl是毫無意義的重複練習。不過世界需要一點點冗餘。精簡主義者總是想把事物分隔開。而我們則總是企圖把它們合併到一起。Perl之所以是簡單的語言是有很多原因的。比如你用不著知道什麼特殊的指令就可以編譯Perl程式--只要把它當做批處理或者shell腳本執行就可以了。Perl的類型和結構很容易使用和理解。Perl對你的數據沒有任何限制--你的字串和數組可以要多長就多長(只要你有足夠的記憶體),而且它們都會自動增長。
Perl不會強迫你學習新的語法和語意,Perl改從許多其它你已經熟悉的語言裡(比如C,awk,BASIC和Python,英文,希臘語等)借來語法。實際上,任何程式設計師都可以從書寫良好的Perl代碼段中讀懂它的含義。最重要的是,你不用先學習所有Perl的東西就可以開始寫有用的程式。你可以寫很小的Perl程式。你也可以象小孩那樣寫Perl程式,我們保證不會笑話你。或者更準確地說是,我們絕不會笑話小孩做事情的創造性。Perl里的許多觀點都是從自然語言中借來的,其中一條最好的觀點就是只要你能把自己的意思表述清楚,那么你就可以使用這些語言的一個子集。Perl文化可以接受任何熟練程度的成員。我們不會在你背後放個語言警察。如果你的老闆不炒你,而且你的Perl腳本也能完成工作,那么它就是“正確”的。儘管Perl很簡單,但它仍然是一種特性很豐富的語言,如果你想用那些特性的話,那你就要學習一些東西。這也是把難題變簡單的學費。雖然你要想把所有Perl能做的事情吸收還需要一些時間,但到你需要這些功能的時候你就會非常開心地發現Perl已經可以做這些事情了。由於Perl的繼承性,就算它只是用做數據歸納語言的時候也有豐富的特性,Perl一開始就設計成可以瀏覽檔案,掃描大量文本並且生成動態數據以及列印出這些數據的良好格式化的報表。不過,隨後Perl就開始風行,於是它就成了可以操作檔案系統,進程管理,資料庫管理,進行C/S編程和安全編程,web信息管理,甚至可以進行面向對象和面向功能的編程的語言。而且這些功能並非只是在Perl這邊,每種新功能都和其它東西交流得很好,別忘了Perl從一開始就是設計成膠水語言的。而且Perl並不僅僅只能黏合它自己的特性。Perl是設計成可以用模組擴展的語言。
你可以用Perl快速設計,編寫,調試和部署Perl套用,並且你還可以在需要的時候很方便地擴展這些套用。你可以在其它語言裡嵌入Perl,而且你也可以在Perl里嵌入其它語言。通過模組輸入機制,你可以把這些外部的擴展當做內置於Perl的特性。那些面向對象的外部庫在Perl內部仍然保持面向對象的特徵。Perl還在許多其它方面協助你。和嚴格的每次執行一條命令的命令檔案和shell腳本不同的是,Perl先把你的程式快速編譯成一種內部格式。和其它任何編譯器一樣,這個時候還進行各種最佳化,同時把碰到的任何問題反饋給你。一旦Perl的編譯器前端對你的程式表示滿意了,它就把這些中間代碼交給解釋器執行(或者是給其它的能生成C或者位元組碼的模組後端)。聽起來挺複雜,不過Perl的編譯器和解釋器幹這些活效率相當高,我們的編譯-運行-修改的過程幾乎都是以秒計。再加上Perl的許多其他開發特性,這種快速的角色轉換很適合做快速原型設計。然後隨著你的程式的成熟,你可以逐步擰緊身上的螺母,減少散漫增強紀律。如果你做得好,Perl也能幫你這個忙。Perl還可以幫你寫更安全的程式。除了其它語言提供的典型的安全接口之外,Perl還通過一種跟蹤數據的機制給你提供預防意外安全錯誤的保護,這樣就可以在災害發生之前預防其發生。最後,Perl還可以讓你設定一個特殊的防護隔段運行那些來源不明的Perl代碼,以此來杜絕危險操作。
不過,偏執一點兒說,Perl幫你的大部分內容和Perl本身沒有什麼關係,而是和使用Perl的人有關。坦率地說,Perl社區的人們可以說是地球上最熱心的人了。如果Perl運動裡面有那么一點點宗教色彩的話,那么這就是它的核心了。Larry希望Perl社區像一小片天堂那樣運轉,目前看來他的願望基本上是實現了。我們也請你為此做出自己的努力。Perl之所以強大,是因為有CPAN,CPAN上面有無數的開源模組,從科學計算到桌面套用到網路等等各個方面都有大量的模組!並且世界上也還有無數的人在向上面添加模組!如果你想要用PERL實現某功能,不用自己做,在CPAN上面搜一搜,多半都會得到已有的結果!CPAN("theComprehensivePerlArchiveNetwork"全面的Perl存檔網路)是查找任何Perl有關的東西的中心倉庫。它包含從整個Perl社區收集來的智慧:成百上千的Perl模組和腳本,相當於好幾本書的文檔,以及整個Perl發布。如果有東西是用Perl寫的,而且這個東西很有用而且是自由的,那么它很有可能就在CPAN上。

缺點

也正是因為Perl的靈活性和“過度”的冗餘語法,也因此獲得了write-only的“美譽”,因為許多Perl程式的代碼令人難以閱讀,實現相同功能的程式代碼長度可以相差十倍百倍。但Perl同樣可以將代碼書寫得像Python或Ruby等語言一樣優雅。
很多時候,perl.exe進程會占用很多的記憶體空間,雖然只是一時,但是感覺不好。

相關文化

時勢造英雄

為了理解Perl為什麼用現在這樣的樣子定義(或者為什麼不定義成其他的樣子),我們必須首先明白為什麼會有Perl。所以,讓我們先挖掘一下布滿塵灰的歷史書....
退回到1986年,Larry是一個系統程式設計師,在做一個多層安全的廣域網項目的開發。他負責這么一個系統,這個系統由西海岸的三台VAX和三台sun機器,通過一條加密了的1200波特的串列線路和東海岸類似配置的系統連線組成的,因為Larry的主要工作是支持(他不是該項目的程式設計師,只是系統專家),所以他就有機會利用他的三種優點(懶惰,不耐心,和狂傲)來開發和提高所有有用的工具——比如rnpatch,和warp。(註:正是在這個時候,Larry被劃入了“計算機動物”的範疇,這是以那些人的不可遏止的“再加一個特性”的渴望為基礎評判的,因為這種行為幾乎成了生物必須。畢竟,如果生活就是太複雜的話,難道程式就不會嗎?尤其是想rn這樣的程式,它真是應該當作一個高級的人工智慧項目來看待,因為他們就可以為你閱讀新聞。當然,有些人已經在說patch程式太複雜了。)
一天,Larry剛剛把rn撕成碎片,把它一片一片地放在他的目錄里,大管理員就跑進來說,“Larry,我們需要一個管理配置,用它控制所有六台VAX和六台sun。我們想在一個月里就要它。你做一個吧!”
所以,從不逃避工作的Larry,開始問自己做一個兩個海岸的CM系統的最好的方法是什麼,它必須不用自己從頭開始寫,並且還可以查閱兩個海岸的問題報告以及核准和控制。他想到的答案只有一個詞:B-news。(註:也就是Usenet傳輸軟體的第二種實現。)
Larry著手在這些機器上安裝了新聞軟體並且增加了兩條控制命令:一條“append”命令用於向現有的文章追加內容,和一條“synchronize”命令保持兩個海岸的文章數目相同。CM可以用RCS(版本控制系統)做,而核准和控制可以用新聞和rn來做。
然後大管理員讓他生成報告。新聞是在核心機器里的一個獨立的檔案里維護的,裡面有許多檔案間的交叉引用。Larry的第一個反應是“用awk。”糟糕的是,那個時候的awk無法做到以檔案里的信息為基礎打開和關閉多個檔案。Larry不想編寫一個特殊目的的工具。結果就是產生了一種新的語言。
最初這種新的語言並不叫Perl。Larry和他的同事及親友(DanFaigin,寫這段歷史的人,和MarkBiggar,他的妻弟,在初始設計階段幫了大忙)交換了一大堆名字。實際上Larry考慮並拋棄了字典里的所有三個或四個字母的單詞。最早的名字是“Gloria”,以他的寶貝(和老婆)命名。但他很快就發現這樣會產生太多家庭混亂。然後名字就成了“Pearl”,它變成了“Perl”,部分原因是Larry看到另外一種叫PEARL的語言的介紹,但最主要的原因是他懶得總要敲五個鍵。當然,這樣Perl就可以用做一個四字母的詞。(不過,你會注意到,這裡有以前首字縮寫的殘餘:“PracticalExtractionAndReportLanguage”。) 最早的Perl沒有今天的Perl那么多的特性。那時候有模式匹配和檔案句柄,有標量,有格式化,但是很少有函式,沒有相關的數組,而且只有一個實現得不怎么樣的正則表達式,(從rn借來的)。手冊頁也只有15頁。但是Perl比sed和awk快,並且開始在該項目的其他套用里使用。 但是其他地方又開始需要Larry了。有一天另外一個大經理來了並且說:“Larry,給R&D做支持。”並且Larry說,好吧。他帶上Perl並且很快發現它逐漸成為系統管理的好工具。他借來HenrySpencer漂亮的正則表達式軟體包並且把它變成更有男人味(不過Henry可能不會願意在正餐的時候考慮這些特性。)然後Larry增加了大部分他想要的特性,以及一些別人想要的特性。然後它就把Perl發布到網路上。(註:更讓人吃驚的是,他先後工作於噴氣推進實驗室(JPL),然後是NetLabs?和Seagate之後,仍然不斷發布新Perl。其他人做了大部分工作,而Larry假裝為O'Reilly&Associates(一個小公司,印刷關於計算機和相關事物的小冊子。)其餘的就是歷史了。(註:而這些東西,是歷史的一個註解。當開始Perl的工作的時候,Larry已經把rn分解成碎片,並且準備做一次全面的重寫。但因為他開始在Perl上幹活,所以Larry沒有再碰rn。它仍然是碎片。有時候Larry說要用Perl重寫rn,但是從來沒當真。) 然後事情的發展就是這樣的:Perl1.0在1987年十二月十八日發布;有些人仍然很認真地對待Perl的生日。Perl2.0在1988年六月發布,並且RandalSchwartz開始了“另外一個Perl黑客”的簽名的傳奇。在1989年,TomChristiansen在巴爾的摩Usenix拿出了第一個公開的Perl教程。1989年十月的Perl3.0開始,這門語言第一次以GNU公眾著作權(GPL)發布和分發。
1990年三月,Larry寫了第一首Perl小詩(見下一節)。然後他和Randal寫了本書的第一版,ThePinkCamel;該書在1991年早期發行。然後Perl4.0就立即發布了;除GPL之外,它還包括了ArtisticLicense(藝術著作權)。
萬眾期待的Perl5在1994年十月發布。這是一個完全重寫的Perl版本,它包括對象和模組。Perl5的到來甚至連TheEcomomist雜誌都提到。到了1995年,正式向Perl社區引入CPAN。在1996年,JonOrwant開始出版ThePerlJournal雜誌。在長時間的猜測之後,本書的第二版,TheBlueCamel,在那年的年末出版。第一次O'ReillyPerl大會(TPC)1997年夏季在加州SanJose舉行。重大事件幾乎是每天都在發生,所以,關於歷史的其他部分,請檢查CPAST(ComprehensivePerlArcanaSocietyTapestry(history.perl.org))上的Perl紀年表。

Perl詩歌

APPEAL:
listen(please,please);
openyourself,wide;
join(you,me),
connect(us,together),
tellme.
dosomethingifdistressed;
@dawn,dance;
@evening,sing;
read(books,$poems,stories)untilpeaceful;
studyifable;
writemeif-you-please;
sortyourfeelings,resetgoals,seek(friends,family,anyone);
do*not*die(likethis)
ifsinabounds;
keys(hidden),open(locks,doors),tellsecrets;
donot,I-beg-you,closethem,yet.
accept(yourself,changes),
bind(grief,despair);
requiretruth,goodnessif-you-will,eachmoment;
select(always),length(of-days).

下載安裝

在Linux系統下、大部分類UNIX系統(包括MacOSX),perl是隨系統安裝的,可在命令行終端輸入命令perl-v,查看版本,對於Windows有兩種版本可用:StrawberryPerl與ActivePerl。

其他信息

Perl語言誕生25周年
1987年12月18日,LarryWall在新聞組comp.sources.misc發布了Perl腳本語言1.0版,當時他是Unisys公司的一名程式設計師。Perl借鑑了sh、Awk和Sed等腳本語言的特性,試圖成為一個能簡化報告處理的通用Unix腳本語言。
Perl2在1988年發布,增加了更多特性,擁有更好的正則表達式引擎。Perl3和Perl4分別在1989年和1991年發布,而1994年發布的Perl5則是最重要的一個版本,至今仍在開發中。2000年啟動的Perl6則完全重寫了Perl,基於不同的原則,開發者決定先制定語言規格。Perl6的發布日期被認為是聖誕節,但沒有指定哪一年的聖誕節。Perl5公布了16個版本,Perl5.6在2000年發布,Perl5.8的持續開發貫穿了2002-2008年,5.10在2007年發布,5.12在2010年發布,此後Perl開始採用每月發布一個版本,每年發布一個穩定版本的發布周期。5.14在2011年發布,5.16於2012年發布,5.18於2013年發布。
(美國)施瓦茨(RandalL.Schwartz)(美國)福瓦(BrianDFoy)(美國)菲尼克斯(TomPhoenix)譯者:盛春
RandalL.Schwartz、briandfoy和DTomPhoenix共同編著了數本Perl編程方面的“必讀”圖書,包括《EffectivePerlProgramming》(由Addison—Wesley出版)、《LearningPerl》、《ProgrammingPerl》、《IntermediatePerl》以及《MasteringPerl》(原版均由O’Reilly出版)。

常見問題

Perl 就是 CGI
噓...小聲。說這樣的話會讓懂Perl的人笑掉大牙。CGI是CommonGatewayInterface的簡稱。其主要的功能是在WWW環境下,藉由從客戶端傳遞一些訊息給WWWServer,再由WWWServer去啟動所指定的程式碼來完成特定的工作。PHP/Python/Perl都可以撰寫基於CGI的程式。另外,Perl可以做太多東西,把它的功能僅限制在網路上實在是暴胗天物。

相關搜尋

熱門詞條

聯絡我們