Can you summarize the following document?
        
  

  拉里·沃爾在1987年開始寫作Perl,那時他正在Unisys當程式設計師,並且在1987年12月18日把1.0版本釋出到了comp.sources.misc新聞組。這個語言在接下來的幾年內很快地發展起來。  Perl 2,於1988年釋出,特色是有一個更好的正規表示式引擎,Perl 3,於1989年釋出,新增了對二進位制資料流的支援。  從前,Perl唯一的文件是一個逐漸變長的手冊頁。在1991年,《Programming Perl》(被許多Perl程式設計師因封面稱為“駱駝書”),出版了,而且變成了一個真正的Perl語言的參考資料。同時,Perl版本號變成了4,不是因為這個語言的重大改變,而是因為這本書的特殊意義。

  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_1模組),codice_2正則引用操作符,一個基礎模組的選集,並且又支援了一些其它的作業系統,包括BeOS。

  Perl 5.6於2000年3月22日釋出。大的修改包括64位支援,Unicode字串支援,大檔案支援(即:超過2GiB的檔案)以及“our”關鍵字。在開發Perl 5.6的時候,開發組決定把版本名稱作成類似其它開源專案的;在5.005_63版之後,下一個版本變成了5.5.640,計劃是開發版本用奇數,穩定版本用偶數。  2000年時,拉里·沃爾詢問社群對Perl新版本的建議。這個程序的結果在361 RFC(評論請求)檔案裡(這個檔案可以指導Perl 6的開發)。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之間的距離。這些特性包括一個switch語句(叫做“given/when”),正規表示式的更新和智慧匹配操作符“~~”。同時,另一個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操作符(有意地用佔位符標記沒有實現的程式碼),預設codice_4(在codice_5時)完整的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語言,並且改變了這個名字。  當指代這個語言的時候,名字通常是大寫的(Perl),就像專有名詞一樣。當指代這個直譯器本身的時候,這個名字通常是小寫的(perl),因為大部分類Unix檔案系統都是區分大小寫的。在《Programming Perl》的第一版釋出之前,用perl指代這個語言也很普遍;Randal L. Schwartz排版時將這個語言的名字在書中寫成大寫的以便理解。後來,這個大小寫的區別就成為正規的了。  全大寫的“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語言的中心思想可以整合為一句話「TMTOWTDI」:  Perl的作者拉里·沃爾建議可以把這個縮寫詞念成「Tim Toady」。這句話後來被擴充成: 另一個Perl程式設計師常常想起的Perl俗語是:

  為了實現這樣的目標,並且又因為Larry Wall本人也是一個語言學家,他設計Perl語言時使用了很多語言學的思維。相比C、Pascal這樣的“高階”語言而言,Perl語言直接提供泛型變數、動態陣列、Hash表等更加便捷的程式設計元素。Perl具有動態語言的強大靈活的特性,並且還從C/C++、Basic、Pascal等語言中分別借鑑了語法規則,從而提供了許多冗餘語法。使得程式設計師可以忽略計算機內部資料儲存、型別、處理方法、運算規則、甚至記憶體越界等等的細節,而將思考中心放在所需要的程式邏輯上。就這一點而言,很多Perl程式設計師認為目前只有Perl、Python等泛型語言才能稱為“高階”語言,而C、Pascal甚至C++這些只能稱為“中高階”語言而已。可以說,在統一變數型別和掩蓋運算細節方面,Perl做得比Python更為出色。  由於從其他語言大量借鑑了語法,使得從其他程式語言轉到Perl語言的程式設計師可以迅速上手寫程式並完成任務,這使得Perl語言是一門容易用的語言。

  也正是因為Perl的靈活性和“過度”的冗餘語法,也因此獲得了僅寫(write-only)的“美譽”,因為Perl程式可以寫得很隨意(例如,變數不經宣告就可以直接使用),但是可能少寫一些字母就會得到意想不到的結果(而不報錯),許多Perl程式的程式碼令人難以閱讀,實現相同功能的程式程式碼長度可以相差十倍百倍,這就令程式的維護者(甚至是編寫者)難以維護。  同樣的,因為Perl這樣隨意的特點,可能會導致一些Perl程式設計師遺忘語法,以至於不得不經常檢視Perl手冊。對此,《Learning Perl》一書裡建議經常使用Perl程式設計。  建議的解決方法是在程式裡使用codice_4以及codice_7,並統一程式碼風格,使用庫,而不是自己使用「硬編碼」。Perl同樣可以將程式碼書寫得像Python或Ruby等語言一樣優雅。

  

  下面是一個在標準輸出裝置上輸出Hello World的簡單程式,這種程式通常作為開始學習程式語言的第一個範例:  print "Hello, world!\n"; 如果有perl 5.10以上的版本,也可以這樣:  use 5.010; say "Hello, world!"; 這個程式將輸出一行字串:“Hello, world!”,以及一個換行。

  Perl是一種無型別語言(untyped),換句話說,在語言層面上,Perl和大多數程式語言不同,不把變數分成整數、字元、浮點數等等,而只有一種能接受各種型別資料的“無型別”變數。Perl的變數以$字元開頭。例如$a=5;$b="Hello";$c=3.2;$d='\n這裡並不換行'都是合法的Perl語句。  Perl中各種變數的運算也很自由,數和含有數的字串是等效的,可以把數字字串參與數學計算,也可以反之,讓數字參與字串的構成和操作。  除單個變數(Perl稱為標量「Scalar」)之外,Perl還有兩種集合型別,分別是陣列(Array,用@字元開頭)和關聯陣列(Associative array,或者稱為Hash,用%開頭。類似C++11的STL 無序表「unordered_map」和Python的字典「Dictionary」)。陣列可以內含任意可變數目的變數,並以其儲存順序作為索引以完成常數時間的定位;而Hash表,則可以在變數之間建立一一對映,就像字典一樣,把不同的變數按照他們的邏輯關係組織起來,並以作為“鍵”的變數進行索引,完成常數時間的定位。  另外,Perl還有一種特殊的型別,引用(reference),類似於指標,當作標量處理,可以指向標量(含引用)、陣列、Hash等任何型別。如:  $foo = \$bar; print $$foo; $foo = \@bar; print @$foo; $foo = \%bar; print %$foo; $foo = \&bar; print $foo->(); print &$foo;  引用的好處在於,將它傳遞給函式之後,函式可以修改它指向的變數。而如果傳遞普通變數,修改的值只在函式內有效。  sub foo my $foo = '2'; my $var = \$foo; print $$var; foo ($var); print $foo;  輸出“21”,即foo()內改變了$foo。

  因為Perl大量的創造冗餘的語法,並且從其他語言中大量的借鑑語法,使得Perl的語法極其豐富和靈活。Perl共有下列幾種判斷語句:  if ($hour > 22) {  print "hello" if $guest >= 1;  unless ($credit > 100) {  print "eat\n" unless $food == 0;  use 5.010; given ($foo)  由於邏輯運算元的作用,還可以寫出不用關鍵字if或unless的判斷語句,如常用的開啟檔案語句:  open DATA, '<', $filename or die "Can't open $filename: $!\n";

  Perl中的迴圈語句也是非常的豐富。主要有:  Perl自己的for或者foreach迴圈(兩個完全一樣):  @group = 1.. 10; for (@group) { print "$_\n" for @group; foreach (@group) {  從C語言借鑑來的for迴圈(又可寫作foreach,兩個完全一樣):  for ($i = 0; $i < 10; $i++) {  while迴圈:  $i=0; while ($i < 10) {  do...while迴圈:  $i = 0; do { } while ($i < 10); until迴圈:  $i = 0; until ($i == 10) {  從PASCAL語言借鑑來的do...until迴圈:  $i = 0; do { } until ($i == 10); 甚至還有利用動態語言特性,用map函式也可以做迴圈:  map { print "$_\n" } @group; 其實還有其他的迴圈方式。總而言之,就是TMTOWTDI。

  Perl主要應用在Unix平臺和網頁中(PHP,CGI)。Perl擁有海量的模組支援,在解決問題時非常方便。CPAN有很多Perl模組。

  Perl Data Language(簡稱PDL)是Perl的一個外接模組,也是對Perl功能的一個重要拓展。它使得Perl語言可以直接對2至多維的矩陣直接操作,進行快速的矩陣運算,完成基礎的Perl所不能完成的運算,大大拓展了Perl的適用範圍。所以PDL本身也是很多其他模組的基礎。  而且PDL提供了與很多其他軟體包的介面,例如FFTW(一個快速傅立葉變換的軟體包),又或者是Mesa(Linux上的OpenGL三維圖形渲染包),這些包原來往往僅提供C/C++語言介面。這一功能使PDL成為拓展Perl功能的一箇中間層。

  

  和C語言一樣,在Perl界,難以讀懂的程式碼大賽是個有名的活動。近似難以讀懂的程式碼,但方向不同,Perl Poetry是可以被perl編譯的詩。新的詩經通常會在Perl Monks網站發表。

  Just another Perl hacker(另一個Perl黑客)是一個和國際C語言混亂程式碼大賽有著相同精神的社群文化。Perl程式設計師通過寫JAPH程式碼,來分享自己的程式設計技術。

  因為許多Perl程式的程式碼難以閱讀,加上它的物件導向功能被視為不是真正的物件導向(只是模組的模擬),於是很多人拿Perl和其他動態語言來比較。  最常見的比較物件是Python,有人寫了篇文章叫What's wrong with Perl,指出Perl的缺點,鼓勵別人學Python。著名黑客埃裡克·斯蒂芬·雷蒙寫Why Python?,該文中一個重要的比較物件就是Perl。A Byte Of Python裡的Why Not Perl? 也把Python和Perl比較。  Ruby的作者(松本行弘,Matz)甚至直認他想Ruby作為Perl的後繼者。

  Perl 6正在開發中,它將會與現在的Perl 5版本有很大不同。在Perl的官網介紹中,Perl 6不是Perl 5的下一個版本,而是與Perl 5平行的另一種程式語言。 其中最主要的改變是,Perl 6更好地支援物件導向,有專用於定義類的語法: class Foo is Universal { # inherit form Universal  可以明確定義變數型別,當型別不匹配,編譯時報錯。  另外,Perl 6提供了不同的正則語法,新的語法稱作「規則」,並且允許使用者在正則中加入空格等以便閱讀,也可以命名一個正則方便呼叫。  Perl 6中的控制流程和迴圈的判斷條件的括號是可選的,如:  if $percent > 100 { for 1..3 { for 1..3 -> $x { while $stuff.is_wrong {  但是如果加入括號,不能緊跟在關鍵字後邊,而要空一格,因為像foo()這樣的形式,會呼叫函式,而不管它是不是關鍵字:  if ($hour > 22) { #正確 if($hour > 22) { #錯誤
Perl是高階、通用、直譯式、動態的程式語言家族。最初設計者拉里·沃爾為了讓在UNIX上進行報表處理的工作變得更方便,決定開發一個通用的指令碼語言,而在1987年12月18日發表。目前,Perl語言家族包含兩個分支Perl 5以及Perl 6。雖然Perl不是正式的首字母縮略詞,但仍有各種各樣的逆向首字母縮略詞,包括“實用的提取和報告語言”。