Perl 最初的設計者為拉裡·沃爾(Larry Wall),它於1987年12月18日發表。Perl借取了C、sed、awk、shell scripting以及很多其他程式語言的特性。Larry Wall在新聞群組comp.sources.misc發布了Perl指令碼語言1.0版,當時他是Unisys公司的一名程式員。Perl借鑒了sh、Awk和Sed等指令碼語言的特性,試圖成為一個能簡化報告處理的通用 Unix指令碼語言。
Perl 2在1988年發布,增加了更多特性,擁有更好的Regex引擎。Perl 3和 Perl 4分別在1989年和1991年發布,而1994年發布的 Perl 5則是最重要的一個版本,至今仍在開發中。2000年啟動的Perl 6則完全重寫了Perl,基於不同的原則,開發人員決定先制定語言規格。Perl 6的發布日期被認為是聖誕節,但沒有指定哪一年的聖誕節。Perl 5公布了16個版本,Perl 5.6在2000年發布,Perl 5.8的持續開發貫穿了2002-08年,5.10在2007年發布,5.12在2010年發布,此後 Perl開始採用每月發布一個版本每年發布一個穩定版本的發布周期,5.14在2011年發布,5.16於2012年發布。
Perl 一般被稱為“實用報表提取語言”(PracticalExtraction andReportLanguage),雖然有時被稱做“病態折中垃圾列表器”(PathologicallyEclectic Rubbish Lister)。它是術語,而不僅僅是簡寫,Perl的創造者,LarryWall提出第一個,但很快又擴充到第二個。那就是為什麼“Perl”沒有所有 字母都大寫。沒必要爭論那一個正確,Larry 兩個都認可。你也可能看到“perl”,所有的字母都是小寫。一般,“Perl”,有大寫的 P,是指語言本身,而“perl”,小寫 p,是指程式啟動並執行解譯器。Perl的正式網站是 www.perl.org。
Perl 的特點
Perl的解釋程式是開放源碼的免費軟體,使用Perl不必擔心費用,Perl能在絕大多數作業系統運行,可以方便地向不同作業系統遷移。
Perl 是一種能完成任務的語言。從一開始,Perl 就設計成可以把簡單工作簡單化,同時又不失去處理困難問題能力的語言。它可以很容易運算元字、文本、檔案和目錄、電腦和網路、特別是程式的語言。這種語言應該很容易運行外部的程式並且掃描這些程式的輸出擷取感興趣的東西,而且它還應該很容易能把這些你感興趣的東西交給其它程式做特殊的處理,當然這種語言還應該很容易在任何現代的作業系統上可以移植地編譯和運行。
Perl 基本文法
標量定義,以$號開頭,如:$num =1;
數組定義,以@開頭,如:@array = (1,2,3);
數組元素調用 @array[index],其中index表示數組下標,如上例,@array[0]的值是1
散列定義,以%開頭,如:%hash=("a",1,"b",2);
散列調用 %hash,其中key表示索引值,如上例,%hash{"b"}的值是1
Perl 的哲學
Perl追求的是簡單, 解決一個一般的問題用它幾行代碼就完成了. 一個稍複雜一點的問題代碼也不會超過一屏! 事實上, 大多數人用Perl寫的程式大多都沒超過100行.
Perl 最初是當做一種 Unix 的膠水語言設計的,但是她早就移植到大多數其它作業系統裡了。因為 Perl 幾乎可以在任何地方運行,所以 Perl 可以說是當今最具有移植性的編程環境。要想寫可移植的 C/C++ 程式,你得在程式裡加上一大堆 #ifdef 標籤來區分不同的系統。要想寫可移植的 Java 程式,你必須理解每種新的 Java 實現的特質。要想寫可移植的shell,你可能要記住每條命令在每種作業系統上的文法,走運的時候你可能可以找到一些公用的東西。而要想寫可移植的 Visual Basic 程式,那麼你只需要對“移植”有個更靈活的定義就可以了。
我們很高興的是 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社區有一個笑話就是,下次股市大崩盤就很有可能是呢個傢伙寫的指令碼裡頭有臭蟲造成的。(不過,樂觀點來看就是,任何還在失業的股票分析師仍然有可以利用的。)
Perl 的成功有許多原因。Perl 早在開源軟體的名字出現之前就已經是一個成功的開源項目了。Perl 是自由的,並將永遠自由下去。你可以在任何合適的場合使用Perl,只需要遵守一個非常自由的著作權就可以了。如果你在從事商務工作並且還想使用 Perl,那麼用就是了。你可以把 Perl 嵌入到你寫的商業軟體中而不需要支付任何費用也沒有任何限制。如果你碰上一個Perl社區解決不了的問題,那你也還有最後的一招:來源程式本身。Perl 社區不會在“升級”的偽裝下租給你它們的商業秘密,而且Perl 社區也不會“停業”,更不會讓你孤立無援。
Perl 是自由軟體這一點無疑對它是有協助的。但這一條並不足以解釋 Perl 現象,因為許多自由軟體包沒有能繁榮起來。Perl 不僅自由;而且好玩。人們覺得自己在 Perl 裡可以有創造力,因為它們有表達的自由:他們可以選擇是為電腦速度最佳化還是為程式員的速度最佳化,是冗長還是簡潔,是選擇可讀性還是可維護性,或者選擇複用性、移植性、接受性和傳授性等等。假如你進入一次模糊的 Perl 比賽,甚至你還可以為模糊性做最佳化。
Perl 可以給予你所有這些自由,因為它是一門有著分裂人格的語言,Perl 同時是很簡單並且很富有的語言。Perl 從其它地方拿來好主意,然後把它們安裝到易用的架構裡面。對於只是喜歡她的人來說,Perl 是實用抽取和報表語言(Practical Extractoin and Report Language)。對那些熱愛她的人而言,她是變態電子垃圾製造者(Pathologically Electric Rubbish Lister)。在少數人眼裡,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("the Comprehensive Perl Archive Network"全面的 Perl 存檔網路)是尋找任何 Perl 有關的東西的中心倉庫。它包含從整個 Perl 社區收集來的智慧:成百上千的 Perl 模組和指令碼,相當於好幾本書的文檔,以及整個 Perl 發布。如果有東西是用 Perl 寫的,而且這個東西很有用而且是自由的,那麼它很有可能就在 CPAN 上。CPAN 在全世界都有鏡象,你可以在位於 http://www.perl.com/CPAN 的 CPAN 路牌上找到離你最近的鏡象。那塊路牌會記住你選擇的是哪個鏡象並且你以後再訪問 http://www.perl.com/CPAN/(注意最後的斜杠)的時候就會自動重新定向到那個鏡象。另外,你也可以從 www.cpan.org開始。這個站的介面不同,但是資料是一樣的。
Perl 文化
1.時勢造英雄
為了理解 Perl 為什麼用現在這樣的樣子定義(或者為什麼不定義成其他的樣子),我們必須首先明白為什麼會有 Perl。所以,讓我們先挖掘一下步滿塵灰的曆史書....
退回到 1986 年,Larry 是一個系統程式員,在做一個多層安全的廣域網路項目的開發。他負責這麼一個系統,這個系統由西海岸的三台 VAX 和三台 sun 機器,通過一條加密了的 1200 傳輸速率的串列線路和東海岸類似配置的系統串連組成的,因為 Larry 的主要工作是支援(他不是該項目的程式員,只是系統專家),所以他就有機會利用他的三種優點(懶惰,不耐心,和狂傲)來開發和提高所有有用的工具——比如 rn、patch和 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 和他的同事及親友(Dan Faigin,寫這段曆史的人,和 Mark Biggar,他的妻弟,在初始設計階段幫了大忙)交換了一大堆名字。實際上 Larry 考慮並拋棄了字典裡的所有三個或四個字母的單詞。最早的名字是“Gloria”,以他的寶貝(和老婆)命名,但他很快就發現這樣會產生太多家庭混亂。
然後名字就成了“Pearl”,最後它變成了我們現在的“Perl”,部分原因是 Larry 看到另外一種叫 PEARL 的語言的介紹,但最主要的原因是他懶得總要敲五個鍵。當然,這樣 Perl 就可以用做一個四字母的詞。(不過,你會注意到,這裡有以前首字縮寫的殘餘:“Practical Extraction And Report Language”。)
最早的 Perl 沒有今天的 Perl 那麼多的特性。那時候有模式比對和檔案控制代碼、有標量、有格式化,但是很少有函數,沒有相關的數組,而且只有一個實現得不怎麼樣的Regex(從 rn 借來的)。手冊頁也只有 15 頁。但是 Perl 比 sed 和 awk 快,並且開始在該項目的其他應用裡使用。
但是其他地方又開始需要 Larry 了。有一天另外一個大經理來了並且說:“Larry,給 R&D 做支援。”並且 Larry 說,好吧。他帶上 Perl 並且很快發現它逐漸成為系統管理的好工具。他借來 Henry Spencer 漂亮的Regex軟體包並且把它變成更有男人味(不過 Henry 可能不會願意在正餐的時候考慮這些特性。)然後 Larry 增加了大部分他想要的特性,以及一些別人想要的特性。然後它就把 Perl 發布到網路上。(註:更讓人吃驚的是,他先後工作於噴氣推進實驗室(JPL),然後是 NetLabs 和 Seagate 之後,仍然不斷髮布新 Perl。現在,其他人做了大部分工作,而 Larry 假裝為 O'Reilly & Associates(一個小公司,印刷關於電腦和相關事物的小冊子。)其餘的就是曆史了。(註:而這些東西,是曆史的一個註解。當開始 Perl 的工作的時候,Larry 已經把 rn 分解成片段,並且準備做一次全面的重寫。但因為他開始在 Perl 上幹活,所以 Larry 沒有再碰 rn,它仍然是片段。有時候 Larry 說要用 Perl 重寫 rn,但是從來沒當真。)
然後事情的發展就是這樣的:Perl 1.0 在 1987 年十二月十八日發布;有些人仍然很認真地對待 Perl 的生日。Perl 2.0 在 1988 年六月發布,並且 Randal Schwartz 開始了“另外一個 Perl 駭客”的簽名的傳奇。在 1989 年,Tom Christiansen 在巴爾的摩 Usenix 拿出了第一個公開的 Perl 教程。1989 年十月的 Perl 3.0開始,這門語言第一次以 GNU 公眾著作權(GPL)發布和分發。
1990 年三月,Larry 寫了第一首 Perl 小詩(見下一節)。然後他和 Randal 寫了本書的第一版,The Pink Camel;該書在 1991 年早期發行。然後 Perl 4.0 就立即發布了;除 GPL 之外,它還包括了 Artistic License(藝術著作權)。
萬眾期待的 Perl 5 在 1994 年十月發布。這是一個完全重寫的 Perl 版本,它包括對象和模組。 Perl 5 的到來甚至連 The Ecomomist 雜誌都提到。到了1995年,正式向 Perl 社區引入 CPAN。在 1996 年,Jon Orwant 開始出版 The Perl Journal 雜誌。在長時間的猜測之後,本書的第二版,The Blue Camel,在那年的年末出版。第一次 O'Reilly Perl 大會(TPC) 1997 年夏季在加州 San Jose 舉行。現在,重大時間幾乎是每天都在發生,所以關於曆史的其他部分,請檢查 CPAST (Comprehensive Perl Arcana Society Tapestry (history.perl.org))上的 Perl 紀年表。
2. Perl 詩歌
在助手框裡的詩歌的仿製品是在1990年的四月一日愚人節張貼到 Usenet 上的。我們不加註釋的把它放在這裡,只是想表示典型的程式設計語言的隱喻真的是多麼讓人作嘔。對所有有文學價值的東西大概都是這樣的吧。Larry 在最初為 Perl 3 寫的那些“Black Perl”到了 Perl 5 不能分析通過之後,真是感覺輕鬆許多。
不過,Larry 自己的文集很幸運地被 Perl 詩歌的王后,Sharon Hopkins 的光芒所掩蓋。她寫了相當多的 Perl 詩歌,以及一些她在 1992 年 Usenet 冬季技術大會上拿出來的關於 Perl 詩歌的文章,標題是“Camels and Needles: Computer Poetry Meets the Perl Programming Language”。(這篇文章可以在 CAPN 的 misc/poetry.ps 找到。)除了是最多產的 Perl 詩人之外,Sharon 還是下面這首詩歌的作者,這首詩是發表得最廣泛的一首,並且曾經在 Economist 和 Guardian 雜誌上刊登:
複製代碼 代碼如下:
#!/usr/bin/perl
APPEAL:
listen (please, please);
open yourself, wide;
join (you, me),
connect (us,together),
tell me.
do something if distressed;
@dawn, dance;
@evening, sing;
read (books,$poems,stories) until peaceful;
study if able;
write me if-you-please;
sort your feelings, reset goals, seek (friends, family, anyone);
do*not*die (like this)
if sin abounds;
keys (hidden), open (locks, doors), tell secrets;
do not, I-beg-you, close them, yet.
accept (yourself, changes),
bind (grief, despair);
require truth, goodness if-you-will, each moment;
select (always), length(of-days)
# listen (a perl poem)
# Sharon Hopkins
# rev. June 19, 1995
Perl Poetry
Article 970 of comp.lang.perl:
Path: jpl-devvax!pl-dexxav!lwall
From: lwall@jpl-dexxav.JPL.NASA.GOV(Larry Wall)
Newsgroups: news.groups,rec.arts.poems,comp.lang.perl
Subject: CALL FOR DISCUSSION: comp.lang.perl.poems
Message-ID:
Date: 1 Apr 90 00:00:00 GMT
Reply-To: lwall@jpl-devvax.JPL.NSAS.GOV(Larry Wall)
Organization: Jet Prepulsion Laboratory, Pasadena, CA
Lines: 61
It has come to my attention that there is a crying need for a place for people to express both their emotional and technical natures simultaneously. Several people have sent me some items which don't fit into any
newsgroup. Perhaps it's because I recently posted to both comp.lang.perl and to rec.arts.poems, but people seem to be writing poems in Perl, and they're asking me where they should post them. Here is a sampling:
From a graduate student (in finals week), the following haiku:
study, write, study,
do review (each word) if time.
close book. sleep? what's that?
And someone writing from Fort Lauderdale writes:
sleep, close together,
sort of sin each spring & wait;
50% die
A person who wishes to remain anonymous wrote the following example of "Black Perl". (The Pearl poet would have been shocked, no doubt.)
BEFOREHAND: close door, each window & exit; wait until time.
open spellbook, study, read (scan, select, tell us);
write it, print the hex while each watches,
reverse its length, write again;
kill spiders, pop them, chop, split, kill them.
unlink arms, shift, wait & listen (listening, wait),
sort the flock (then, warn the "goats" & kill the "sheep");
kill them, dump qualms, shift moralities,
values aside, each one;
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill the next sacrifice, each sacrifice,
wait, redo ritual until "all the spirits are pleased";
do it ("as they say").
do it(*everyone***must***participate***in***forbidden**s*e*x*).
return last victim; package body;
exit crypt (time, times & "half a time") & close it,
select (quickly) & warn your next victim;
AFTERWORDS: tell nobody.
wait, wait until time;
wait until next year, next decade;
sleep, sleep, die yourself,
die at last
I tried that, and it actually parses in Perl. It doesn't appear to do anything useful, however. I think I'm glad, actually... I hereby propose the creation of comp.lang.perl.poems as a place for such items, so we don't clutter the perl or poems newsgroups with things that may be of interest to neither. Or, alternately, we should create rec.arts.poems.perl for items such as those above which merely parse, and don't do anything useful. (There is precedent in rec.arts.poems, after all.) Then also create comp.lang.perl.poems for poems that actually do something, such as this haiku of my own:
print STDOUT q
Just another Perl hacker,
unless $spring
Larry Wall lwall@jpl-devvax.jpl.nasa.gov
古老的 Perl 永遠也不停止創新的步伐,7月18日,Perl 5.8.0 發布了。
5.8.0 的亮點主要有:
- 更好的 Unicode 支援:
自從 5.6 版以來, Unicode 支援已在各層面上大幅更新:
- 支援 Unicode 3.2.0 版 (Perl 5.6.1 支援 3.0.1 版)
- 在語言及內部層次上, 提供更普遍而平滑的 Unicode 環境
- 正則表示式能夠配合Unicode 了
- 提供 Encode 模組, 以支援現存的編碼方式 (包括各種中/日/韓系統)
- 多線程執行模式:
「解譯器多線程法」(interpreter threads, 簡稱「ithreads」) 是新的多線程執行模式。我們強烈建議您用它來取代舊版的「5.005 多線程法」模式. 兩者間主要的差異, 在於 ithreads 下必需明確宣告要共用的資料.
- 新的輸入/輸出模式:
新推出的 PerlIO 模式, 同時提供了源碼層級的跨平台stdio 實作, 以及更豐富的輸出入控制架構.
- 更精確的數值:
之前的 Perl 版本依賴於您系統上的字串/數值轉換函式; 這往往造成了跨平台的障礙, 以及錯誤的計算結果.
- 64 位元支援:
目前的 64 位元支援已經成熟 -- 若您的系統支援 64 位元的整數或地址空間,就可以在編譯時間指定使用這些功能.
- 安全的訊號 (signal) 處理:
之前的版本裡, Perl 在接收訊號時可能會破壞解譯器的內部狀態.
- 大量的新模組:
Digest::MD5, File::Temp, Filter::Simple, libnet, List::Util,Memoize, MIME::Base64, Scalar::Util, Storable, Switch,Test::More, Test::Simple, Text::Balanced, Tie::File, ...
- 徹底的相容性測試:
Perl 現在具備了六倍於 5.6 版的測試套件, 並且每日在各種平台上進行裝設測試.
[相容性]
- 二進位檔案不相容:
主要由於 PerlIO 的匯入, Perl 5.8 與先前的 Perl 版本之間並無「二進位相容性」. 您可能會需要再次編譯各個 XS 延伸模組.
- AIX 動態載入:
為了與 AIX 系統上的其他程式更加相容, Perl 在 AIX 系統上啟用了系統的動態載入, 而非早先的類比方式.
- 停用 64 位元平台上的 Perl Malloc 記憶體配置:
Perl 的 malloc 函數在 64 位元定址的機器上似乎有許多問題. 因此, 我們現在預設使用系統原生的 malloc 函數.
- 散列順序又改變了:
Perl 內部的散列函數又改成了較好的版本, 不過只要您的源碼不依賴於特定的散列鍵順序, 這就不成問題.
- my 的屬性改在執行階段處理:
my() 變數的屬性目前改在執行階段處理, 而非編譯階段.
- REF(...) 取代了 SCALAR(...):
為符合 ref() 的結果, 對參照 (reference) 的參照在字串裡改以 "REF(...)"表示.
- 更新的 Unicode 處理模式, 大幅減少了需要使用 "use utf8" 之處:在 Perl 5.6 版時, 資料是否視為 Unicode, 端視其運算是否處於 "use utf8",編譯命令的有效範圍內而定; 現在, Perl 5.8 直接將 "Unicode 性質" 連結到資料上. 因此, 目前只有在程式碼內用到 UTF-8 字面值 (literal) 時, 才需使用 "use utf8". (在沒有 "use utf8" 時, 為了保持與現存命令稿的相容性,字面值仍視為位元組處理.)
- VMS: Socket 延伸模組動態化, Alpha 預設使用 IEEE 浮點數
- Socket 延伸模組在 VMS 平台上改為動態載入; 這在極舊版的 VMS 上可能會造成問題.
- OpenVMS Alpha目前預設使用 IEEE 浮點數格式. 這樣做的理由及細節, 請見README.vms.
[用詞改變]
- 《駱駝書》(Programming Perl, 《Perl 程式設計》) 第三版內的「IO 規則」(IO discipline), 現在改稱為「IO 層」(IO layer).
[不建議使用]
- dump():
dump 指令的功能, 目前視同作廢.
- 5.005 多線程法模式已不建議使用
請採用新的「解譯器多線程法」模式.
- 虛擬散列 (Pseudohash):
使用者層級的虛擬散列文法將被移除, 改成比較簡潔的操作介面. 此外, 內部的實作方式也必須更改, 因為它減緩了一般散列的存取速度.
- "exec(串列)" 與 "system(串列)" 參數內的受汙染 (tainted) 資料:
目前這會觸發警告訊息, 但在未來的版本裡會變成致命錯誤.
- tr///C, tr///U:
這兩個操作介面是個意外; 請採用 pack("C0", ...) 及 pack("U0", ...).
[已知問題]
- AmigaOS 無法裝設 Perl 5.8.0.
- 編譯套件: 位元碼編譯及原生碼編譯仍然有問題.
- Lvalue 左值函數仍然視為實驗性質.
- local() 與 tie() 的互動使用結果, 仍未清楚定義.
- 繫結(Tied) 或魔法(Magical) 陣列及散列並不會自動產生 (Autovivify).
- 自我繫結的陣列及散列, 目前禁用.
---
再次提醒您, 請詳閱 pod/perldelta.pod, INSTALL, 以及 README.平台。