Perl

Perl是高階、通用、直譯式、動態的程式語言家族。最初設計者拉里·沃爾為了讓在UNIX上進行報表處理的工作變得更方便，決定開發一個通用的指令碼語言，而在1987年12月18日發表。目前，Perl語言家族包含兩個分支Perl 5以及Perl 6。雖然Perl不是正式的首字母縮略詞，但仍有各種各樣的逆向首字母縮略詞，包括“實用的提取和報告語言”。Perl借用了C、sed、awk、shell指令碼、Lisp以及很多其他程式語言的特性。其中最重要的特性是Perl內部集成了正則表示式的功能，以及巨大的第三方程式碼庫CPAN。2000年開始，拉里·沃爾著手開發Perl 6來作為Perl的後繼，Perl 6語言的語法有很多轉變，也被視為Perl家族中的另一個語言。Perl語言應用廣泛，涵蓋CGI、圖形程式設計、系統管理、網路程式設計、金融、生物等領域。由於其靈活性，Perl被稱為指令碼語言中的瑞士軍刀。歷史.早期版本.拉里·沃爾在1987年開始寫作Perl，那時他正在Unisys當程式設計師，並且在1987年12月18日把1.0版本釋出到了comp.sources.misc新聞組。這個語言在接下來的幾年內很快地發展起來。沃爾最早的確把這個語言稱為“Pearl”，因為他希望自己開發的語言有一個吉利的名字而且要儘量短小好記，他甚至聲稱早已考慮過所有三個及四個字母的詞彙，以及自己妻子的名字Gloria。然而另一門語言PEARL早已存在，為了防止混淆，沃爾才把它改名Perl。Perl 2，於1988年釋出，特色是有一個更好的正則表示式引擎，Perl 3，於1989年釋出，添加了對二進位制資料流的支援。從前，Perl唯一的文件是一個逐漸變長的手冊頁。在1991年，《Programming Perl》，出版了，而且變成了一個真正的Perl語言的同時，Perl版本號變成了4，不是因為這個語言的重大改變，而是因為這本書的特殊意義。早期的Perl 5.Perl 4的一系列維護的版本，最後一版是1993年的Perl 4.036。那時，沃爾廢棄了Perl 4，開始開發Perl 5。Perl 5的最初始設計持續到了1994年。《"perl5-porters"》郵件列表於1994年5月為了共同移植Perl 5而建立。這將主要的論壇留給了Perl 5的開發，維護，和移植。Perl 5.000於1994年10月17日釋出。這是一個幾乎完全重寫了的直譯器，而且它給這個語言添加了很多新的特性，包括物件，引用，區域性變數，和模組。很重要地，模組提供了一個不用修改直譯器就可以擴充套件語言的方法。這使得核心的直譯器非常穩定，即使它允許一般的Perl程式設計師新增新的語言特性。從此，Perl 5的開發就活躍起來了。Perl 5.001於1995年3月13日釋出。Perl 5.002於1996年2月29日釋出，帶有引數型別的特性。這允許模組的作者寫出像Perl內部命令那樣智慧的子程式。Perl 5.003於1996年6月25日作為一個安全更新的版本釋出。Perl 5歷史中最重要的事件之一是支援了模組。在1995年10月26日，CPAN，一個釋出Perl模組的網站，建立了；截至2015年11月，它已經有超過12457個作者寫的157794多個模組了。Perl 5.004於1997年5月15日釋出，添加了UNIVERSAL包，這給了Perl一個所有的類的基礎和要求使用模組的特定版本的能力。另一個重要的開發是包括了CGI.pm模組，有助於Perl發展為一個CGI指令碼語言。Perl現在也支援在Microsoft Windows和其它一些作業系統下運作。Perl 5.005於1998年7月22日釋出。這個版本包括了一個更好的正則引擎，一個編譯系統，codice_2正則引用運算子，一個基礎模組的選集，並且又支援了一些其它的作業系統，包括BeOS。2000年至今.Perl 5.6於2000年3月22日釋出。大的修改包括64位支援，Unicode字串支援，大檔案支援以及“our”關鍵字。在開發Perl 5.6的時候，開發組決定把版本名稱作成類似其它開源專案的；在5.005_63版之後，下一個版本變成了5.5.640，計劃是開發版本用奇數，穩定版本用偶數。2000年時，拉里·沃爾詢問社群對Perl新版本的建議。這個程序的結果在361 RFC。2001年，工作開始於設計Perl 6，一系列的檔案概述了新一代Perl裡的改變和設計。它們是作為一期RFC被展示的，而不是一個正式文件。這時，Perl 6的存在還只是一門語言的概述。Perl 5.8最初於2002年7月18日釋出，從此，每年才有一次更新。Perl 5.8的最後一版是5.8.9，釋出於2008年12月14日。Perl 5.8改進了Unicode支援，添加了一個新的IO處理機制和新的多執行緒處理，提高了數字精度，添加了一些新模組。2004年，工作開始於提要——原來的建議檔案，但後來變成了Perl 6語言的詳述。2005年2月，唐鳳，開始開發Pugs，一個用Haskell寫的Perl 6直譯器。這是最初的一個Perl 6實現。這個努力停止於2006年。2007年12月18日，Perl 1.0的20週年紀念日，Perl 5.10.0釋出了。Perl 5.10.0包括了顯著的新特性，這拉近了Perl 5和6之間的距離。這些特性包括一個，正則表示式的更新和智慧匹配運算子“~~”。同時，另一個Perl 6的實現，Rakudo Perl的開發開始了，一起使用Parrot虛擬機器開發。從2009年11月開始，Rakudo Perl已經是每月一更新，現在已經是Perl 6的最完整的一個實現了。Perl 5開發過程中的一次大修改在Perl 5.11；開發社群使用了每月更新的形式，這樣就可以提前預知3個月以內的釋出日期。2010年4月12日，Perl 5.12.0釋出了。顯著的提升包括新的codice_3語法，Yada Yada運算子完整的Y2038編譯，正則轉化過載，DTrace支援，和Unicode5.2。Perl 5.12.3於2011年1月21日釋出；它包括了新版的模組和一些文件的改變。版本5.12.4於2011年6月20日釋出。Perl 5.14釋出於2011年5月14日。這個分支的最後一版，5.14.2，釋出於2011年9月26日。Perl 5.16釋出於2012年5月20日。顯著的新特性包括可以指定一個perl的版本來模擬，這允許使用者更新perl的版本，但可以執行可能會不相容的老指令碼。Perl 5.16也更新了核心部分來支援Unicode 6.1。名稱.Perl原名叫“Pearl”。拉里·沃爾想給這個語言起一個有正面意思的短的名字；他考慮了字典裡每一個3—4個字母的詞。他也考慮用他的妻子Gloria的名字命名。沃爾在Perl官方釋出之前發現了現有的PEARL語言，並且改變了這個名字。當指代這個語言的時候，名字通常是大寫的，因為大部分類Unix檔案系統都是區分大小寫的。在《》的第一版釋出之前，用perl指代這個語言也很普遍；排版時將這個語言的名字在書中寫成大寫的以便理解。後來，這個大小寫的區別就成為正規的了。全大寫的“PERL”是有爭議的，而文件中說明“PERL”是不對的，一些核心的社群成員將其視為外行的標誌。這個名字偶爾會被視為“Practical Extraction and Report Language”的縮寫，就像文件頂端和一些紙質書本說的那樣。一些全稱被建議作為正式名稱，包括沃爾自己的幽默的“Pathologically Eclectic Rubbish Lister”。的確，沃爾要求這個名字啟示許多不同的擴充套件。駱駝標誌.《"Programming Perl"》，由奧萊利媒體釋出，特色是封面有一張駱駝的圖片，因而被稱作“駱駝書”。這張駱駝的圖片已經成為了Perl非官方的標誌和一個駭客的標誌，這出現在T恤衫和其它衣服上。奧萊利擁有此影象之商標，並且宣稱，唯有在捍衛「符號之完整性」時，才會行使其法律上的權力。奧萊利允許此商標在非商業目的之前提下被使用，並同時供了Programming Republic of Perl的影象以及Powered by Perl的按鈕圖。Perl的另一個識別符號是羊駝。因為《Intermediate Perl》一書的封面是一隻羊駝。洋蔥標誌.Perl基金會擁有一個可選的標誌，一個洋蔥，允許它的子站點，Perl Mongers，PerlMonks，Perl.org和其它網站使用。Perl簡介.Perl語言的中心思想.Perl語言的中心思想可以整合為一句話「TMTOWTDI」：There's More Than One Way To Do It.Perl的作者拉里·沃爾建議可以把這個縮寫詞念成「Tim Toady」。這句話後來被擴充成:There's more than one way to do it, but sometimes consistency is not a bad thing either.另一個Perl程式設計師常常想起的Perl俗語是：Easy things should be easy, and hard things should be possible.優點.為了實現這樣的目標，並且又因為Larry Wall本人也是一個語言學家，他設計Perl語言時使用了很多語言學的思維。相比C、Pascal這樣的“高階”語言而言，Perl語言直接提供泛型變數、動態陣列、Hash表等更加便捷的程式設計元素。Perl具有動態語言的強大靈活的特性，並且還從C/C++、Basic、Pascal等語言中分別借鑑了語法規則，從而提供了許多冗餘語法。使得程式設計師可以忽略計算機內部資料儲存、型別、處理方法、運算規則、甚至記憶體越界等等的細節，而將思考中心放在所需要的程式邏輯上。就這一點而言，很多Perl程式設計師認為目前-{只}-有Perl、Python等泛型語言才能稱為“高階”語言，而C、Pascal甚至C++這些-{只}-能稱為“中高階”語言而已。可以說，在統一變數型別和掩蓋運算細節方面，Perl做得比Python更為出色。由於從其他語言大量借鑑了語法，使得從其他程式語言轉到Perl語言的程式設計師可以迅速上手寫程式並完成任務，這使得Perl語言是一門容易用的語言。缺點.也正是因為Perl的靈活性和“過度”的冗餘語法，也因此獲得了僅寫難以維護。同樣的，因為Perl這樣隨意的特點，可能會導致一些Perl程式設計師遺忘語法，以至於不得不經常檢視Perl手冊。對此，《Learning Perl》一書裡建議經常使用Perl程式設計。建議的解決方法是在程式裡使用codice_4以及codice_7，並統一程式碼風格，使用庫，而不是自己使用「硬編碼」。Perl同樣可以將程式碼書寫得像Python或Ruby等語言一樣優雅。Perl的語法.Perl的Hello World程式.下面是一個在標準輸出裝置上輸出Hello World的簡單程式，這種程式通常作為開始學習程式語言的第一個範例：print "Hello, world!\n";如果有perl 5.10以上的版本，也可以這樣：use 5.010;say "Hello, world!";這個程式將輸出一行字串：“Hello, world!”，以及一個換行。變數.Perl是一種無型別語言，換句話說，在語言層面上，Perl和大多數程式語言不同，不把變數分成整數、字元、浮點數等等，而-{只}-有一種能接受各種型別資料的“無型別”變數。Perl的變數以$字元開頭。例如codice_8codice_9codice_10codice_11都是合法的Perl語句。Perl中各種變數的運算也很自由，數和含有數的字串是等效的，可以把數字字串參與數學計算，也可以反之，讓數字參與字串的構成和操作。除單個變數。陣列可以內含任意可變數目的變數，並以其儲存順序作為索引以完成常數時間的定位；而Hash表，則可以在變數之間建立一一對映，就像字典一樣，把不同的變數按照他們的邏輯關係組織起來，並以作為“鍵”的變數進行索引，完成常數時間的定位。另外，Perl還有一種特殊的型別，引用、陣列、Hash等任何型別。如：$foo = \$bar; print $$foo;$foo = \@bar; print @$foo;$foo = \%bar; print %$foo;$foo = \&amp;bar; print $foo-&gt;(); print &amp;$foo;引用的好處在於，將它傳遞給函式之後，函式可以修改它指向的變數。而如果傳遞普通變數，修改的值只在函式內有效。sub foomy $var = shift;$$var = '1';my $foo = '2';my $var = \$foo;print $$var;foo ($var);print $foo;輸出“21”，即foo()內改變了$foo。判斷語句.因為Perl大量的創造冗餘的語法，並且從其他語言中大量的借鑑語法，使得Perl的語法極其豐富和靈活。Perl共有下列幾種判斷語句：if ($hour &gt; 22) {print "should sleep...\n";print "hello" if $guest &gt;= 1;unless ($credit &gt; 100) {print "You can not graduate!\n";print "eat\n" unless $food == 0;use 5.010;given ($foo)say 'a' when 'a';when (/b/) { say 'b'; } #when可以寫成語句或區塊default { say 'not match'; } #只可以寫成區塊。由於邏輯運算元的作用，還可以寫出不用關鍵字if或unless的判斷語句，如常用的開啟檔案語句：open DATA, ' 22) { #錯誤say 'should sleep...';英文資源、社群.