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