Perl

早期版本

拉里·沃爾在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 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日釋出。這個版本包括了一個更好的正規引擎，一個編譯系統（通過B::*模組），qr//正規參照運算子，一個基礎模組的選集，並且又支援了一些其它的作業系統，包括BeOS。

名稱

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和其它網站使用。

優點

為了實現這樣的目標，並且又因為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編程。
建議的解決方法是在程式裡使用use strict;以及use warnings;，並統一程式碼風格，使用庫，而不是自己使用「寫死」。Perl同樣可以將程式碼書寫得像Python或Ruby等語言一樣優雅。

Perl的Hello World程式

下面是一個在標準輸出裝置上輸出Hello World的簡單程式，這種程式通常作為開始學習程式語言的第一個範例：
#!/usr/bin/env perlprint "Hello, world!\n";
如果有perl 5.10以上的版本，也可以這樣：
#!/usr/bin/env perluse 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 $var = shift;
    $$var = '1';}my $foo = '2';my $var = \$foo;print $$var;foo ($var);print $foo;
輸出「21」，即foo()內改變了$foo。

迴圈語句

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

Perl的應用

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

Perl Data Language

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

Perl詩經

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

JAPH

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 6正在開發中，它將會與現在的Perl 5版本有很大不同。在Perl的官網介紹中，Perl 6不是Perl 5的下一個版本，而是與Perl 5平行的另一種程式語言。
其中最主要的改變是，Perl 6會是完全物件導向的，有專用於宣告類別的語法：
class Foo is Universal { # inherit form Universal
    has $member_variable

    method member_function {
        print "some string";
    }}
而且可以給變數定義類型，當類型不匹配時，就會報錯。
另外，Perl 6提供了不同的正規語法，新的語法稱作「規則」，並且允許使用者在正規中加入空格等以便閱讀，也可以命名一個正規方便調用。
Perl 6中的控制流程和循環的判斷條件的括號是可選的，如:
if $percent > 100  {
    say "weird mathematics";}for 1..3 {
    # using $_ as loop variable
    say 2 * $_;}for 1..3 -> $x {
    # with explicit loop variable
    say 2 * $x;}while $stuff.is_wrong {
    $stuff.try_to_make_right;}
但是如果加入括號，不能緊跟在關鍵字後邊，而要空一格，因為像foo()這樣的形式，會調用函式，而不管它是不是關鍵字：
if ($hour > 22) { #正確
    say 'should sleep...';}if($hour > 22) { #錯誤
    say 'should sleep...';}