Perl 最初的設(shè)計者為拉里·沃爾(Larry Wall),它于1987年12月18日發(fā)表。Perl借取了C、sed、awk、shell scripting以及很多其他程序語言的特性。Larry Wall在新聞組comp.sources.misc發(fā)布了Perl腳本語言1.0版,當(dāng)時他是Unisys公司的一名程序員。Perl借鑒了sh、Awk和Sed等腳本語言的特性,試圖成為一個能簡化報告處理的通用 Unix腳本語言。
Perl 2在1988年發(fā)布,增加了更多特性,擁有更好的正則表達(dá)式引擎。Perl 3和 Perl 4分別在1989年和1991年發(fā)布,而1994年發(fā)布的 Perl 5則是最重要的一個版本,至今仍在開發(fā)中。2000年啟動的Perl 6則完全重寫了Perl,基于不同的原則,開發(fā)者決定先制定語言規(guī)格。Perl 6的發(fā)布日期被認(rèn)為是圣誕節(jié),但沒有指定哪一年的圣誕節(jié)。Perl 5公布了16個版本,Perl 5.6在2000年發(fā)布,Perl 5.8的持續(xù)開發(fā)貫穿了2002-08年,5.10在2007年發(fā)布,5.12在2010年發(fā)布,此后 Perl開始采用每月發(fā)布一個版本每年發(fā)布一個穩(wěn)定版本的發(fā)布周期,5.14在2011年發(fā)布,5.16于2012年發(fā)布。
Perl 一般被稱為“實用報表提取語言”(PracticalExtraction andReportLanguage),雖然有時被稱做“病態(tài)折中垃圾列表器”(PathologicallyEclectic Rubbish Lister)。它是術(shù)語,而不僅僅是簡寫,Perl的創(chuàng)造者,LarryWall提出第一個,但很快又?jǐn)U展到第二個。那就是為什么“Perl”沒有所有 字母都大寫。沒必要爭論那一個正確,Larry 兩個都認(rèn)可。你也可能看到“perl”,所有的字母都是小寫的。一般,“Perl”,有大寫的 P,是指語言本身,而“perl”,小寫的 p,是指程序運行的解釋器。Perl的正式網(wǎng)站是 www.perl.org。
Perl 的特點
Perl的解釋程序是開放源碼的免費軟件,使用Perl不必?fù)?dān)心費用,Perl能在絕大多數(shù)操作系統(tǒng)運行,可以方便地向不同操作系統(tǒng)遷移。
Perl 是一種能完成任務(wù)的語言。從一開始,Perl 就設(shè)計成可以把簡單工作簡單化,同時又不失去處理困難問題能力的語言。它可以很容易操作數(shù)字、文本、文件和目錄、計算機(jī)和網(wǎng)絡(luò)、特別是程序的語言。這種語言應(yīng)該很容易運行外部的程序并且掃描這些程序的輸出獲取感興趣的東西,而且它還應(yīng)該很容易能把這些你感興趣的東西交給其它程序做特殊的處理,當(dāng)然這種語言還應(yīng)該很容易在任何現(xiàn)代的操作系統(tǒng)上可以移植地編譯和運行。
Perl 基本語法
標(biāo)量定義,以$號開頭,如:$num =1;
數(shù)組定義,以@開頭,如:@array = (1,2,3);
數(shù)組元素調(diào)用 @array[index],其中index表示數(shù)組下標(biāo),如上例,@array[0]的值是1
散列定義,以%開頭,如:%hash=("a",1,"b",2);
散列調(diào)用 %hash,其中key表示鍵值,如上例,%hash{"b"}的值是1
Perl 的哲學(xué)
Perl追求的是簡單, 解決一個一般的問題用它幾行代碼就完成了. 一個稍復(fù)雜一點的問題代碼也不會超過一屏! 事實上, 大多數(shù)人用Perl寫的程序大多都沒超過100行.
Perl 最初是當(dāng)做一種 Unix 的膠水語言設(shè)計的,但是她早就移植到大多數(shù)其它操作系統(tǒng)里了。因為 Perl 幾乎可以在任何地方運行,所以 Perl 可以說是當(dāng)今最具有移植性的編程環(huán)境。要想寫可移植的 C/C++ 程序,你得在程序里加上一大堆 #ifdef 標(biāo)簽來區(qū)分不同的系統(tǒng)。要想寫可移植的 Java 程序,你必須理解每種新的 Java 實現(xiàn)的特質(zhì)。要想寫可移植的shell,你可能要記住每條命令在每種操作系統(tǒng)上的語法,走運的時候你可能可以找到一些公共的東西。而要想寫可移植的 Visual Basic 程序,那么你只需要對“移植”有個更靈活的定義就可以了。
我們很高興的是 Perl 避免了所有這些問題,同時還保留了這些語言中的許多優(yōu)點,同時還有一些自己的特色。Perl 的特色來自許多方面:它的特性集的工具,Perl 社區(qū)的創(chuàng)造性,以及開源運動的大環(huán)境。不過,許多這些特性都是混合的東西;Perl 的身世復(fù)雜,它總是把事物看成是優(yōu)點的不同方面,而不是弱點。Perl 是“背黑鍋我來”的語言。如果你覺得自己陷入一團(tuán)亂麻之中,非??释杂?,那么請使用 Perl。
Perl 是跨文化的。Perl 的爆炸性增長很大程度上是因為那些前 Unix 系統(tǒng)程序員的渴望,他們希望從他們的“老家”帶著盡可能多的東西。對于他們而言,Perl 是可移植的 Unix 文化蒸餾器,是"此路不通"的沙漠中的綠洲。從另外一個角度來看,Perl 還可以從另外一個方向運轉(zhuǎn):在 Windows 上工作的 web 設(shè)計者通常會非常開心地發(fā)現(xiàn)他們的 Perl 程序可以不加修改地在 Unix 服務(wù)器上跑。
盡管 Perl 在系統(tǒng)程序員和 web 設(shè)計師中間非常流行,但這只是因為是他們最早發(fā)現(xiàn) Perl 的,Perl 可以用于更廣泛的用途。從 Perl 最早的文本處理語言開始,它已經(jīng)發(fā)展成為一種非常復(fù)雜的,通用的編程語言,以及完整的開發(fā)環(huán)境,包括調(diào)試器、調(diào)節(jié)器、交叉引用、編譯器、庫、語法提示編輯器,以及所有其它“真正”的編程語言所具有的所有掛勾,只要你需要。當(dāng)然這些東西都是讓我們可能處理難的問題的東西,而且很多其它語言也可以做到這一點。 Perl 之所以成為 Perl 是因為它從來不會因為保持簡單事情簡單化而丟失其他方面的特性。
因為 Perl 既強大又好用,所以它被廣泛地用于日常生活的方方面面,從宇航工程到分子生物學(xué),從數(shù)學(xué)到語言學(xué),從圖形處理到文檔處理,從數(shù)據(jù)庫操作到網(wǎng)絡(luò)管理。很多人用 Perl 進(jìn)行快速處理那些很難分析或轉(zhuǎn)換的大批量數(shù)據(jù),不管你是處理 DNA 序列、網(wǎng)頁、還是豬肚皮的未來都無所謂。實際上,在 Perl社區(qū)有一個笑話就是,下次股市大崩盤就很有可能是呢個家伙寫的腳本里頭有臭蟲造成的。(不過,樂觀點來看就是,任何還在失業(yè)的股票分析師仍然有可以利用的。)
Perl 的成功有許多原因。Perl 早在開源軟件的名字出現(xiàn)之前就已經(jīng)是一個成功的開源項目了。Perl 是自由的,并將永遠(yuǎn)自由下去。你可以在任何合適的場合使用Perl,只需要遵守一個非常自由的版權(quán)就可以了。如果你在從事商業(yè)活動并且還想使用 Perl,那么用就是了。你可以把 Perl 嵌入到你寫的商業(yè)軟件中而不需要支付任何費用也沒有任何限制。如果你碰上一個Perl社區(qū)解決不了的問題,那你也還有最后的一招:源程序本身。Perl 社區(qū)不會在“升級”的偽裝下租給你它們的商業(yè)秘密,而且Perl 社區(qū)也不會“停業(yè)”,更不會讓你孤立無援。
Perl 是自由軟件這一點無疑對它是有幫助的。但這一條并不足以解釋 Perl 現(xiàn)象,因為許多自由軟件包沒有能繁榮起來。Perl 不僅自由;而且好玩。人們覺得自己在 Perl 里可以有創(chuàng)造力,因為它們有表達(dá)的自由:他們可以選擇是為計算機(jī)速度優(yōu)化還是為程序員的速度優(yōu)化,是冗長還是簡潔,是選擇可讀性還是可維護(hù)性,或者選擇復(fù)用性、移植性、接受性和傳授性等等。假如你進(jìn)入一次模糊的 Perl 比賽,甚至你還可以為模糊性做優(yōu)化。
Perl 可以給予你所有這些自由,因為它是一門有著分裂人格的語言,Perl 同時是很簡單并且很富有的語言。Perl 從其它地方拿來好主意,然后把它們安裝到易用的框架里面。對于只是喜歡她的人來說,Perl 是實用抽取和報表語言(Practical Extractoin and Report Language)。對那些熱愛她的人而言,她是變態(tài)電子垃圾制造者(Pathologically Electric Rubbish Lister)。在少數(shù)人眼里,Perl 是毫無意義的重復(fù)練習(xí),不過世界需要一點點冗余,精簡主義者總是想把事物分隔開,而我們則總是企圖把它們合并到一起。
Perl 之所以是簡單的語言是有很多原因的。比如你用不著知道什么特殊的指令就可以編譯 Perl 程序--只要把它當(dāng)做批處理或者shell 腳本執(zhí)行就可以了。Perl 的類型和結(jié)構(gòu)很容易使用和理解。Perl 對你的數(shù)據(jù)沒有任何限制--你的字串和數(shù)組可以要多長就多長(只要你有足夠的內(nèi)存),而且它們都會自動增長。Perl 不會強迫你學(xué)習(xí)新的語法和語意,Perl 改從許多其它你已經(jīng)熟悉的語言里(比如 C、awk、BASIC 和 Python、英文、希臘語等)借來語法。實際上,任何程序員都可以從書寫良好的 Perl 代碼段中讀懂它的含義。
最重要的是,你不用先學(xué)習(xí)所有 Perl 的東西就可以開始寫有用的程序。你可以寫很小的 Perl 程序。你也可以象小孩那樣寫 Perl 程序,我們保證不會笑話你?;蛘吒鼫?zhǔn)確地說是,我們絕不會笑話小孩做事情的創(chuàng)造性。Perl 里的許多觀點都是從自然語言中借來的,其中一條最好的觀點就是只要你能把自己的意思表述清楚,那么你就可以使用這些語言的一個子集。Perl 文化可以接受任何熟練程度的成員。我們不會在你背后放個語言警察。如果你的老板不炒你,而且你的 Perl 腳本也能完成工作,那么它就是“正確”的。
盡管 Perl 很簡單,但它仍然是一種特性很豐富的語言,如果你想用那些特性的話,那你就要學(xué)習(xí)一些東西,這也是把難題變簡單的學(xué)費。雖然你要想把所有 Perl 能做的事情吸收還需要一些時間,但到你需要這些功能的時候你就會非常開心地發(fā)現(xiàn) Perl 已經(jīng)可以做這些事情了。
由于 Perl 的繼承性,就算它只是用做數(shù)據(jù)歸納語言的時候也有豐富的特性,Perl 一開始就設(shè)計成可以瀏覽文件,掃描大量文本并且生成動態(tài)數(shù)據(jù)以及打印出這些數(shù)據(jù)的良好格式化的報表。不過,隨后 Perl 就開始風(fēng)行,于是它就成了可以操作文件系統(tǒng)、進(jìn)程管理、數(shù)據(jù)庫管理、進(jìn)行 C/S 編程和安全編程、web 信息管理、甚至可以進(jìn)行面向?qū)ο蠛兔嫦蚬δ艿木幊痰恼Z言。而且這些功能并非只是在 Perl 這邊,每種新功能都和其它東西交流得很好,別忘了 Perl 從一開始就是設(shè)計成膠水語言的。
而且 Perl 并不僅僅只能黏合它自己的特性。Perl 是設(shè)計成可以用模塊擴(kuò)展的語言。你可以用 Perl 快速設(shè)計,編寫,調(diào)試和部署 Perl 應(yīng)用,并且你還可以在需要的時候很方便地擴(kuò)展這些應(yīng)用。你可以在其它語言里嵌入Perl,而且你也可以在 Perl 里嵌入其它語言。通過模塊輸入機(jī)制,你可以把這些外部的擴(kuò)展當(dāng)做內(nèi)置于 Perl 的特性。那些面向?qū)ο蟮耐獠繋煸?Perl 內(nèi)部仍然保持面向?qū)ο蟮奶卣鳌?/p>
Perl 還在許多其它方面協(xié)助你。和嚴(yán)格的每次執(zhí)行一條命令的命令文件和 shell 腳本不同的是,Perl 先把你的程序快速編譯成一種內(nèi)部格式。和其它任何編譯器一樣,這個時候還進(jìn)行各種優(yōu)化,同時把碰到的任何問題反饋給你。一旦 Perl 的編譯器前端對你的程序表示滿意了,它就把這些中間代碼交給解釋器執(zhí)行(或者是給其它的能生成C或者字節(jié)碼的模塊后端)。聽起來挺復(fù)雜,不過 Perl 的編譯器和解釋器干這些活效率相當(dāng)高,我們的編譯-運行-修改的過程幾乎都是以秒計。再加上 Perl 的許多其他開發(fā)特性,這種快速的角色轉(zhuǎn)換很適合做快速原型設(shè)計。然后隨著你的程序的成熟,你可以逐步擰緊身上的螺母,減少散漫增強記律。如果你做得好,Perl 也能幫你這個忙。
Perl 還可以幫你寫更安全的程序。除了其它語言提供的典型的安全接口之外,Perl 還通過一種跟蹤數(shù)據(jù)的機(jī)制給你提供預(yù)防意外安全錯誤的保護(hù),這樣就可以在災(zāi)害發(fā)生之前預(yù)防其發(fā)生。最后,Perl 還可以讓你設(shè)置一個特殊的防護(hù)隔段運行那些來源不明的 Perl 代碼,以此來杜絕危險操作。
不過,偏執(zhí)一點兒說,Perl 幫你的大部分內(nèi)容和 Perl 本身沒有什么關(guān)系,而是和使用 Perl 的人有關(guān)。坦率地說,Perl 社區(qū)的人們可以說是地球上最熱心的人了。如果 Perl 運動里面有那么一點點宗教色彩的話,那么這就是它的核心了。Larry 希望 Perl 社區(qū)像一小片天堂那樣運轉(zhuǎn),目前看來他的愿望基本上是實現(xiàn)了。我們也請你為此做出自己的努力。
Perl之所以強大, 是因為有CPAN, CPAN上面有無數(shù)的開源模塊, 從科學(xué)計算到桌面應(yīng)用到網(wǎng)絡(luò)等等各個方面都有大量的模塊! 并且現(xiàn)在世界上也還有無數(shù)的人在向上面添加模塊! 如果你想要用PERL實現(xiàn)某功能, 不用自己做, 在CPAN上面搜一搜, 多半都會得到已有的結(jié)果! CPAN("the Comprehensive Perl Archive Network"全面的 Perl 存檔網(wǎng)絡(luò))是查找任何 Perl 有關(guān)的東西的中心倉庫。它包含從整個 Perl 社區(qū)收集來的智慧:成百上千的 Perl 模塊和腳本,相當(dāng)于好幾本書的文檔,以及整個 Perl 發(fā)布。如果有東西是用 Perl 寫的,而且這個東西很有用而且是自由的,那么它很有可能就在 CPAN 上。CPAN 在全世界都有鏡象,你可以在位于 http://www.perl.com/CPAN 的 CPAN 路牌上找到離你最近的鏡象。那塊路牌會記住你選擇的是哪個鏡象并且你以后再訪問 http://www.perl.com/CPAN/(注意最后的斜杠)的時候就會自動重新定向到那個鏡象。另外,你也可以從 www.cpan.org開始。這個站的界面不同,但是數(shù)據(jù)是一樣的。
Perl 文化
1.時勢造英雄
為了理解 Perl 為什么用現(xiàn)在這樣的樣子定義(或者為什么不定義成其他的樣子),我們必須首先明白為什么會有 Perl。所以,讓我們先挖掘一下步滿塵灰的歷史書....
退回到 1986 年,Larry 是一個系統(tǒng)程序員,在做一個多層安全的廣域網(wǎng)項目的開發(fā)。他負(fù)責(zé)這么一個系統(tǒng),這個系統(tǒng)由西海岸的三臺 VAX 和三臺 sun 機(jī)器,通過一條加密了的 1200 波特的串行線路和東海岸類似配置的系統(tǒng)連接組成的,因為 Larry 的主要工作是支持(他不是該項目的程序員,只是系統(tǒng)專家),所以他就有機(jī)會利用他的三種優(yōu)點(懶惰,不耐心,和狂傲)來開發(fā)和提高所有有用的工具——比如 rn、patch和 warp。(注:正是在這個時候,Larry 被劃入了“計算機(jī)動物”的范疇,這是以那些人的不可遏止的“再加一個特性”的渴望為基礎(chǔ)評判的,因為這種行為幾乎成了生物必須。畢竟,如果生活就是太復(fù)雜的話,難道程序就不會嗎?尤其是想 rn 這樣的程序,它真是應(yīng)該當(dāng)作一個高級的人工智能項目來看待,因為他們就可以為你閱讀新聞。當(dāng)然,有些人已經(jīng)在說 patch 程序太復(fù)雜了。)
一天,Larry 剛剛把 rn 撕成碎片,把它一片一片地放在他的目錄里,大管理員就跑進(jìn)來說,“Larry,我們需要一個管理配置,用它控制所有六臺 VAX 和六臺 sun。我們想在一個月里就要它,你做一個吧!”
所以,從不逃避工作的 Larry,開始問自己做一個兩個海岸的 CM 系統(tǒng)的最好的方法是什么,它必須不用自己從頭開始寫,并且還可以查閱兩個海岸的問題報告以及核準(zhǔn)和控制。他想到的答案只有一個詞:B-news。(注:也就是 Usenet 傳輸軟件的第二種實現(xiàn)。)
Larry 著手在這些機(jī)器上安裝了新聞軟件并且增加了兩條控制命令:一條“append”命令用于向現(xiàn)有的文章追加內(nèi)容,和一條“synchronize”命令保持兩個海岸的文章數(shù)目相同。CM 可以用 RCS(版本控制系統(tǒng))做,而核準(zhǔn)和控制可以用新聞和 rn 來做。到目前挺好。
然后大管理員讓他生成報告。新聞是在核心機(jī)器里的一個獨立的文件里維護(hù)的,里面有許多文件間的交叉引用。Larry 的第一個反應(yīng)是“用 awk?!痹愀獾氖?,那個時候的 awk 無法做到以文件里的信息為基礎(chǔ)打開和關(guān)閉多個文件。Larry 不想編寫一個特殊目的的工具,結(jié)果就是產(chǎn)生了一種新的語言。最初這種新的語言并不叫 Perl。Larry 和他的同事及親友(Dan Faigin,寫這段歷史的人,和 Mark Biggar,他的妻弟,在初始設(shè)計階段幫了大忙)交換了一大堆名字。實際上 Larry 考慮并拋棄了字典里的所有三個或四個字母的單詞。最早的名字是“Gloria”,以他的寶貝(和老婆)命名,但他很快就發(fā)現(xiàn)這樣會產(chǎn)生太多家庭混亂。
然后名字就成了“Pearl”,最后它變成了我們現(xiàn)在的“Perl”,部分原因是 Larry 看到另外一種叫 PEARL 的語言的介紹,但最主要的原因是他懶得總要敲五個鍵。當(dāng)然,這樣 Perl 就可以用做一個四字母的詞。(不過,你會注意到,這里有以前首字縮寫的殘余:“Practical Extraction And Report Language”。)
最早的 Perl 沒有今天的 Perl 那么多的特性。那時候有模式匹配和文件句柄、有標(biāo)量、有格式化,但是很少有函數(shù),沒有相關(guān)的數(shù)組,而且只有一個實現(xiàn)得不怎么樣的正則表達(dá)式(從 rn 借來的)。手冊頁也只有 15 頁。但是 Perl 比 sed 和 awk 快,并且開始在該項目的其他應(yīng)用里使用。
但是其他地方又開始需要 Larry 了。有一天另外一個大經(jīng)理來了并且說:“Larry,給 RD 做支持?!辈⑶?Larry 說,好吧。他帶上 Perl 并且很快發(fā)現(xiàn)它逐漸成為系統(tǒng)管理的好工具。他借來 Henry Spencer 漂亮的正則表達(dá)式軟件包并且把它變成更有男人味(不過 Henry 可能不會愿意在正餐的時候考慮這些特性。)然后 Larry 增加了大部分他想要的特性,以及一些別人想要的特性。然后它就把 Perl 發(fā)布到網(wǎng)絡(luò)上。(注:更讓人吃驚的是,他先后工作于噴氣推進(jìn)實驗室(JPL),然后是 NetLabs 和 Seagate 之后,仍然不斷發(fā)布新 Perl?,F(xiàn)在,其他人做了大部分工作,而 Larry 假裝為 O'Reilly Associates(一個小公司,印刷關(guān)于計算機(jī)和相關(guān)事物的小冊子。)其余的就是歷史了。(注:而這些東西,是歷史的一個注解。當(dāng)開始 Perl 的工作的時候,Larry 已經(jīng)把 rn 分解成碎片,并且準(zhǔn)備做一次全面的重寫。但因為他開始在 Perl 上干活,所以 Larry 沒有再碰 rn,它仍然是碎片。有時候 Larry 說要用 Perl 重寫 rn,但是從來沒當(dāng)真。)
然后事情的發(fā)展就是這樣的:Perl 1.0 在 1987 年十二月十八日發(fā)布;有些人仍然很認(rèn)真地對待 Perl 的生日。Perl 2.0 在 1988 年六月發(fā)布,并且 Randal Schwartz 開始了“另外一個 Perl 黑客”的簽名的傳奇。在 1989 年,Tom Christiansen 在巴爾的摩 Usenix 拿出了第一個公開的 Perl 教程。1989 年十月的 Perl 3.0開始,這門語言第一次以 GNU 公眾版權(quán)(GPL)發(fā)布和分發(fā)。
1990 年三月,Larry 寫了第一首 Perl 小詩(見下一節(jié))。然后他和 Randal 寫了本書的第一版,The Pink Camel;該書在 1991 年早期發(fā)行。然后 Perl 4.0 就立即發(fā)布了;除 GPL 之外,它還包括了 Artistic License(藝術(shù)版權(quán))。
萬眾期待的 Perl 5 在 1994 年十月發(fā)布。這是一個完全重寫的 Perl 版本,它包括對象和模塊。 Perl 5 的到來甚至連 The Ecomomist 雜志都提到。到了1995年,正式向 Perl 社區(qū)引入 CPAN。在 1996 年,Jon Orwant 開始出版 The Perl Journal 雜志。在長時間的猜測之后,本書的第二版,The Blue Camel,在那年的年末出版。第一次 O'Reilly Perl 大會(TPC) 1997 年夏季在加州 San Jose 舉行?,F(xiàn)在,重大時間幾乎是每天都在發(fā)生,所以關(guān)于歷史的其他部分,請檢查 CPAST (Comprehensive Perl Arcana Society Tapestry (history.perl.org))上的 Perl 紀(jì)年表。
2. Perl 詩歌
在助手框里的詩歌的仿制品是在1990年的四月一日愚人節(jié)張貼到 Usenet 上的。我們不加注釋的把它放在這里,只是想表示典型的編程語言的隱喻真的是多么讓人作嘔。對所有有文學(xué)價值的東西大概都是這樣的吧。Larry 在最初為 Perl 3 寫的那些“Black Perl”到了 Perl 5 不能分析通過之后,真是感覺輕松許多。
不過,Larry 自己的文集很幸運地被 Perl 詩歌的王后,Sharon Hopkins 的光芒所掩蓋。她寫了相當(dāng)多的 Perl 詩歌,以及一些她在 1992 年 Usenet 冬季技術(shù)大會上拿出來的關(guān)于 Perl 詩歌的文章,標(biāo)題是“Camels and Needles: Computer Poetry Meets the Perl Programming Language”。(這篇文章可以在 CAPN 的 misc/poetry.ps 找到。)除了是最多產(chǎn)的 Perl 詩人之外,Sharon 還是下面這首詩歌的作者,這首詩是發(fā)表得最廣泛的一首,并且曾經(jīng)在 Economist 和 Guardian 雜志上刊登:
復(fù)制代碼 代碼如下:
#!/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 永遠(yuǎn)也不停止創(chuàng)新的步伐,7月18日,Perl 5.8.0 發(fā)布了。
5.8.0 的亮點主要有:
- 更好的 Unicode 支持:
自從 5.6 版以來, Unicode 支持已在各層面上大幅更新:
- 支持 Unicode 3.2.0 版 (Perl 5.6.1 支持 3.0.1 版)
- 在語言及內(nèi)部層次上, 提供更普遍而平滑的 Unicode 環(huán)境
- 正則表示式能夠配合Unicode 了
- 提供 Encode 模塊, 以支持現(xiàn)存的編碼方式 (包括各種中/日/韓系統(tǒng))
- 多線程執(zhí)行模式:
「解釋器多線程法」(interpreter threads, 簡稱「ithreads」) 是新的多線程執(zhí)行模式。我們強烈建議您用它來取代舊版的「5.005 多線程法」模式. 兩者間主要的差異, 在于 ithreads 下必需明確宣告要共享的資料.
- 新的輸入/輸出模式:
新推出的 PerlIO 模式, 同時提供了源碼層級的跨平臺stdio 實作, 以及更豐富的輸出入控制架構(gòu).
- 更精確的數(shù)值:
之前的 Perl 版本依賴于您系統(tǒng)上的字串/數(shù)值轉(zhuǎn)換函數(shù); 這往往造成了跨平臺的障礙, 以及錯誤的計算結(jié)果.
- 64 比特支持:
目前的 64 比特支持已經(jīng)成熟 -- 若您的系統(tǒng)支持 64 比特的整數(shù)或地址空間,就可以在編譯時指定使用這些功能.
- 安全的信號 (signal) 處理:
之前的版本里, Perl 在接收信號時可能會破壞解釋器的內(nèi)部狀態(tài).
- 大量的新模塊:
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 現(xiàn)在具備了六倍于 5.6 版的測試套件, 并且每日在各種平臺上進(jìn)行裝設(shè)測試.
[兼容性]
- 二進(jìn)制檔案不兼容:
主要由于 PerlIO 的導(dǎo)入, Perl 5.8 與先前的 Perl 版本之間并無「二進(jìn)制兼容性」. 您可能會需要再次編譯各個 XS 延伸模塊.
- AIX 動態(tài)載入:
為了與 AIX 系統(tǒng)上的其他程序更加兼容, Perl 在 AIX 系統(tǒng)上啟用了系統(tǒng)的動態(tài)載入, 而非早先的模擬方式.
- 停用 64 比特平臺上的 Perl Malloc 內(nèi)存配置:
Perl 的 malloc 函數(shù)在 64 比特定址的機(jī)器上似乎有許多問題. 因此, 我們現(xiàn)在預(yù)設(shè)使用系統(tǒng)原生的 malloc 函數(shù).
- 散列順序又改變了:
Perl 內(nèi)部的散列函數(shù)又改成了較好的版本, 不過只要您的源碼不依賴于特定的散列鍵順序, 這就不成問題.
- my 的屬性改在執(zhí)行階段處理:
my() 變數(shù)的屬性目前改在執(zhí)行階段處理, 而非編譯階段.
- REF(...) 取代了 SCALAR(...):
為符合 ref() 的結(jié)果, 對參照 (reference) 的參照在字串里改以 "REF(...)"表示.
- 更新的 Unicode 處理模式, 大幅減少了需要使用 "use utf8" 之處:在 Perl 5.6 版時, 資料是否視為 Unicode, 端視其運算是否處于 "use utf8",編譯命令的有效范圍內(nèi)而定; 現(xiàn)在, Perl 5.8 直接將 "Unicode 性質(zhì)" 連結(jié)到資料上. 因此, 目前只有在程序碼內(nèi)用到 UTF-8 字面值 (literal) 時, 才需使用 "use utf8". (在沒有 "use utf8" 時, 為了保持與現(xiàn)存命令稿的兼容性,字面值仍視為字節(jié)處理.)
- VMS: Socket 延伸模塊動態(tài)化, Alpha 預(yù)設(shè)使用 IEEE 浮點數(shù)
- Socket 延伸模塊在 VMS 平臺上改為動態(tài)載入; 這在極舊版的 VMS 上可能會造成問題.
- OpenVMS Alpha目前預(yù)設(shè)使用 IEEE 浮點數(shù)格式. 這樣做的理由及細(xì)節(jié), 請見README.vms.
[用詞改變]
- 《駱駝書》(Programming Perl, 《Perl 程序設(shè)計》) 第三版內(nèi)的「IO 規(guī)則」(IO discipline), 現(xiàn)在改稱為「IO 層」(IO layer).
[不建議使用]
- dump():
dump 指令的功能, 目前視同作廢.
- 5.005 多線程法模式已不建議使用
請采用新的「解釋器多線程法」模式.
- 虛擬散列 (Pseudohash):
使用者層級的虛擬散列語法將被移除, 改成比較簡潔的操作界面. 此外, 內(nèi)部的實作方式也必須更改, 因為它減緩了一般散列的存取速度.
- "exec(串列)" 與 "system(串列)" 參數(shù)內(nèi)的受污染 (tainted) 資料:
目前這會觸發(fā)警告訊息, 但在未來的版本里會變成致命錯誤.
- tr///C, tr///U:
這兩個操作界面是個意外; 請采用 pack("C0", ...) 及 pack("U0", ...).
[已知問題]
- AmigaOS 無法裝設(shè) Perl 5.8.0.
- 編譯套件: 比特碼編譯及原生碼編譯仍然有問題.
- Lvalue 左值函數(shù)仍然視為實驗性質(zhì).
- local() 與 tie() 的交互使用結(jié)果, 仍未清楚定義.
- 系結(jié)(Tied) 或魔法(Magical) 陣列及散列并不會自動生成 (Autovivify).
- 自我系結(jié)的陣列及散列, 目前禁用.
---
再次提醒您, 請詳閱 pod/perldelta.pod, INSTALL, 以及 README.平臺。