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...';}