发布于2026-06-29 阅读(0)
扫一扫,手机访问
Perl 最初的设计者拉里·沃尔(Larry Wall)在 1987 年 12 月 18 日发布了这门语言——一个从 C、sed、awk、shell scripting 以及许多其他语言特性中借力的“混血儿”。当时拉里还是 Unisys 公司的程序员,他在新闻组 comp.sources.misc 上放出了 Perl 1.0 版本,初衷很简单:做一个能简化报告处理的通用 Unix 脚本语言。

随后 Perl 的进化速度相当快:1988 年 Perl 2 带来了更好的正则表达式引擎,1989 年和 1991 年分别有了 Perl 3 和 Perl 4。但真正奠定地位的还是 1994 年发布的 Perl 5——直到今天它仍在活跃开发中。2000 年启动的 Perl 6 则是一次从头开始的重新设计,开发团队决定先制定语言规格再动手。至于发布日嘛,大家只说“圣诞节”,至于哪一年的圣诞节……没人说得准。Perl 5 的版本迭代也很有意思:5.6 于 2000 年发布,5.8 的持续开发贯穿 2002-2008 年,5.10 在 2007 年,5.12 在 2010 年,之后开始采用每月发布一个开发版、每年发布一个稳定版的节奏,5.14 和 5.16 分别在 2011、2012 年登场。
说到名字,Perl 通常被称作“实用报表提取语言”(Practical Extraction and Report Language),尽管也有人戏称它为“病态折中垃圾列表器”(Pathologically Eclectic Rubbish Lister)。其实 Perl 并不是缩写,只是拉里先提出第一个解释,后来又扩展了第二个——所以 Perl 没必要全部大写。你还会看到小写的“perl”,通常指程序运行的解释器;而首字母大写的“Perl”则指语言本身。官方站点是 www.perl.org。
Perl 的解释器是开源免费软件,不用担心费用问题,而且它几乎能在所有主流操作系统上运行,迁移起来非常方便。
从一开始,Perl 的设计哲学就是“能完成任务的语言”——把简单工作变得简单,同时不失去处理复杂问题的能力。数字、文本、文件、目录、网络、进程……它都能轻松摆弄。更重要的是,Perl 能方便地运行外部程序并捕获输出,再把这些数据传递给其他工具做进一步加工。而且,它天生就是可移植的——在任何现代操作系统上几乎都能直接编译运行。
标量定义以 $ 开头:$num = 1;
数组定义以 @ 开头:@array = (1,2,3);
数组元素用 @array[index] 调用,下标从 0 开始,比如 @array[0] 的值是 1。
散列(哈希)定义以 % 开头:%hash = ("a",1,"b",2);
通过键名取值:%hash{"b"} 的值是 1。
Perl 追求的是简洁——解决一个常见问题往往只需要几行代码。稍微复杂一点的场景也不会超过一屏。事实上,大多数人用 Perl 写的程序都不到 100 行。
最初 Perl 是作为 Unix 的“胶水语言”设计的,但它早已移植到几乎所有操作系统上。从这个角度看,Perl 可能是当今最具移植性的编程环境。写可移植的 C/C++ 需要一大堆 #ifdef,写可移植的 Ja va 要摸透每种实现的脾性,写可移植的 shell 就得记住每条命令在各系统上的语法——而 Perl 统统避开了这些坑,同时保留了其他语言里的好东西,还加了不少自己的特色。
Perl 的基因来自多个方向:工具集的智慧、社区的创造力,以及开源运动的土壤。但它从不把这些多样性视为弱点——Perl 是“背黑锅我来”的语言。如果你觉得自己被各种框架捆得喘不过气,渴望自由,那就用 Perl 吧。
Perl 是跨文化的。早期 Unix 系统程序员带着自己的习惯迁移到新平台时,发现 Perl 就像一座可移植的 Unix 文化蒸馏器——在“此路不通”的沙漠里找到的绿洲。反过来也一样:在 Windows 上工作的 Web 设计师会惊喜地发现,自己的 Perl 脚本不加修改就能在 Unix 服务器上跑。
尽管 Perl 在系统程序员和 Web 开发者中尤为流行,但这只是因为他们是第一批发现它的人。Perl 早已从最初的文本处理语言,长成了一套完整的通用编程环境:调试器、优化器、交叉引用、编译器、库、语法提示编辑器……应有尽有。当然,这些也是很多其他语言能做到的。但 Perl 之所以是 Perl,在于它从来不因为“保持简单”而丢掉应对复杂问题的能力。
因为既强大又好用,Perl 被用在了几乎你能想到的所有领域:从宇航工程到分子生物学,从数学到语言学,从图形处理到文档处理,从数据库操作到网络管理。很多人拿它来处理那些难以分析或转换的大批量数据——无论是 DNA 序列、网页还是猪肚皮的期货价格都不在话下。Perl 社区里有个笑话说,下次股市崩盘很可能是因为某个家伙写的脚本里有个臭虫。不过乐观地想,任何失业的股票分析师还能靠 Perl 找到新工作嘛。
Perl 的成功原因很多。早在“开源”这个词出现之前,Perl 就已经是一个成功的开源项目了。它是自由的,并将永远自由下去——你可以在任何场合使用它,只需遵守一个非常宽松的版权声明。商业项目完全可以直接拿来用,嵌入到你的软件中也不收任何费用。如果社区解决不了你的问题,你还有最后的手段:源代码本身。Perl 社区不会在“升级”的伪装下租给你商业秘密,也不会“停业”,更不会让你孤立无援。
自由固然重要,但单靠这一条不足以解释 Perl 现象。Perl 不仅自由,而且好玩。人们在 Perl 里能找到创造力——你可以根据实际需要选择为计算机速度优化,还是为程序员的速度优化;选择冗长还是简洁;选择可读性、可维护性、复用性、移植性……甚至如果去参加模糊 Perl 比赛,你还可以专门为模糊性做优化。这些自由的背后,是 Perl 那“分裂的人格”——它同时是简单和富有的语言。它从别处拿来好主意,然后装进易用的框架里。对喜欢它的人来说,Perl 是实用报表提取语言;对热爱它的人来说,它是变态电子垃圾制造者;在少数人眼里它只是毫无意义的重复练习……但世界需要一点点冗余,精简主义者想把事物分隔开,而 Perl 偏偏喜欢把它们合并到一起。
Perl 之所以简单,原因很多。你不需要知道什么特殊指令就能编译——把它当批处理或 shell 脚本执行就行。类型和结构容易上手。数据几乎没有限制:字符串和数组可以要多长就多长,而且会自动增长。Perl 不强迫你学新语法——它从你熟悉的 C、awk、BASIC、Python、英语甚至希腊语里借来语法。实际上,任何程序员都能从一段写好的 Perl 代码中读懂它在做什么。
最重要的是,你不用学完所有 Perl 知识就能开始写有用的程序。你可以写很小的脚本,也可以像小孩子一样写——我们保证不笑你。或者说,我们绝不会嘲笑小孩做事的创造性。Perl 从自然语言中借来的一个核心观点就是:只要能把自己的意思表述清楚,那用语言的一个子集就够了。Perl 文化接纳所有熟练程度的成员,不会有人在背后当语言警察。只要你的老板不炒你,脚本也能完成工作,那它就是“正确”的。
但 Perl 又是一种特性极其丰富的语言——如果你想用那些特性,当然得花点学费。虽然要把所有 Perl 能做的事都吸收需要时间,但等真正需要时,你会非常开心地发现它已经准备好了。
因为继承性,Perl 从数据整理时代就累积了大量特性。它最初设计成能浏览文件、扫描大量文本、生成动态数据并打印出良好格式化的报表。后来它开始风行,于是逐渐支持文件系统操作、进程管理、数据库管理、C/S 编程、安全编程、Web 信息管理,甚至面向对象和函数式编程。关键是这些新功能都能和旧特性无缝协作——别忘了它从一开始就是胶水语言。
而且 Perl 不止能黏合自己的特性。它通过模块机制可以快速设计、编写、调试和部署应用,并随时扩展。你可以在其他语言里嵌入 Perl,也可以在 Perl 里嵌入其他语言。通过模块导入,外部扩展用起来就像内置特性一样自然——面向对象的外部库在 Perl 里依然保持对象特征。
Perl 在开发效率上也很有想法。它会先把你的程序快速编译成内部格式,进行优化并反馈错误。一旦编译器前端满意,就把中间代码交给解释器(也可以交给能生成 C 或字节码的后端)。听起来复杂,但编译-运行-修改几乎以秒计。这种快速周转非常适合原型设计,随着程序成熟,你可以逐步收紧约束,增加纪律——Perl 同样能帮你做到。
安全性方面,Perl 除了提供典型的安全接口,还通过数据追踪机制预防意外的安全错误,并在灾难发生前发出预警。你甚至可以让 Perl 设置一个防护隔段,安全运行来源不可信的代码。
不过说实话,Perl 给的大部分帮助其实和语言本身关系不大,而是和使用 Perl 的人有关。Perl 社区可以说是地球上最热心的一群人了。如果这运动里有那么点宗教色彩,那这就是它的核心。拉里希望 Perl 社区像一小片天堂那样运转——目前看基本实现了。我们也请你一起努力。
Perl 之所以强大,CPAN 功不可没。上面有无数的开源模块,从科学计算到桌面应用再到网络,几乎没有找不到的。如果你想用 Perl 实现某个功能,不用自己重新发明轮子——去 CPAN 搜一搜,多半已有现成的。“Comprehensive Perl Archive Network”是查找一切 Perl 相关资源的中心仓库,包含了整个社区的智慧:成百上千的模块和脚本,相当于好几本书的文档,以及整个 Perl 发布。只要是用 Perl 写的有用且自由的东西,大概率就在 CPAN 上。CPAN 在全球都有镜象,可以从 http://www.perl.com/CPAN 的路牌找到最近的站,或者直接访问 www.cpan.org。
要理解 Perl 为什么是今天这个样子,得先看看它怎么来的。翻开布满灰尘的历史书吧。
回到 1986 年,拉里当时是系统程序员,负责一个多层安全的广域网项目。西海岸有三台 VAX 和三台 Sun 机器,通过加密的 1200 波特串行线与东海岸类似配置相连。拉里的主要工作是系统支持(不是项目程序员),这让他有机会发挥三大优点:懒惰、不耐心和狂傲,从而开发和改进各种工具——比如 rn、patch 和 warp。也是在这时,拉里被划入了“计算机动物”范畴,因为他有无法遏止的“再加一个特性”的渴望。毕竟,如果生活已经那么复杂,程序难道不该复杂点吗?尤其是像 rn 这样的程序,简直应该视作高级人工智能项目——那样它就能替你看新闻了。当然,有些人已经在说 patch 太复杂了。
一天,拉里刚把 rn 撕成碎片,一片片散落在目录里,大管理员跑进来说:“拉里,我们需要一个管理配置系统,控制所有六台 VAX 和六台 Sun。一个月内搞定,你来吧。”从不逃避工作的拉里开始寻思,怎么做一套两岸的配置管理系统?得不用从头写,还要能查阅两边的报告、做核准和控制。答案只有一个:B-news(Usenet 传输软件的第二种实现)。
拉里在这些机器上装了新闻软件,增加两条控制命令:“append”用于追加内容,“synchronize”用于保持两岸文章数一致。配置管理用 RCS 做,核准和控制用新闻和 rn 搞定。一切顺利。
接着大管理员让他生成报告。新闻系统里有一大堆文件间的交叉引用。拉里第一反应是用 awk——但当时的 awk 无法根据文件内的信息打开和关闭多个文件。他不想写一个专用工具,结果就诞生了一门新语言。最开始不叫 Perl,拉里和同事、亲友讨论了一大堆名字,几乎翻遍了字典里所有三个或四个字母的单词。最早的名字是“Gloria”(取自他宝贝和妻子),但很快发现这会在家庭里造成混乱。
接着名字变成“Pearl”,最后成了现在的“Perl”——部分原因是拉里看到另一种叫 PEARL 的语言的介绍,更主要原因是懒得敲五个键。这样 Perl 就可以当做一个四字母词来玩。当然,这也留下了“Practical Extraction And Report Language”的缩写痕迹。
最早的 Perl 没多少特性:有模式匹配、文件句柄、标量、格式化,但函数很少,没有关联数组,正则表达式也只有一个简陋版本(从 rn 借来)。手册页只有 15 页。但它比 sed 和 awk 快,开始在项目里被其他用途采用。
后来拉里被调到研发支持部门,他带着 Perl 过去,很快发现它在系统管理里很好用。他借来 Henry Spencer 漂亮的正则表达式包,加入更多特性。然后他增加了大部分自己想要以及别人想要的功能,最终把 Perl 发布到了网络上。更让人吃惊的是,后来他先后在喷气推进实验室、NetLabs、Seagate 工作,都不耽误继续发布新版本。现在大部分工作由其他人完成,拉里则在 O'Reilly & Associates 假装写书。剩下的就是历史了。
时间线:Perl 1.0 于 1987 年 12 月 18 日发布(有些人仍严肃地过 Perl 生日);1988 年 6 月 Perl 2.0,Randal Schwartz 开始了“另一个 Perl 黑客”签名的传奇;1989 年 Tom Christiansen 在巴尔的摩 Usenix 做了第一个公开 Perl 教程;1989 年 10 月 Perl 3.0 首次以 GPL 发布;1990 年 3 月拉里写了第一首 Perl 小诗,随后和 Randal 合著了《粉色骆驼》第一版,1991 年早期发行;紧接着 Perl 4.0 发布,除了 GPL 还加入了 Artistic License;1994 年 10 月万众期待的 Perl 5 发布,完全重写,包含对象和模块,连《经济学人》杂志都报道了;1995 年 CPAN 正式引入;1996 年 Jon Orwant 创办《The Perl Journal》;《蓝色骆驼》第二版在同年年底出版;1997 年首届 O'Reilly Perl 大会在圣何塞举办。之后重大事件几乎每天都在发生,更详细的历史可以查阅 CPAST(history.perl.org)上的 Perl 纪年表。
下面这首诗歌的仿制品是 1990 年愚人节张贴在 Usenet 上的。不加注释地放在这里,只是为了展示典型的编程语言隐喻能让人多倒胃口——有文学价值的东西大概都这样吧。拉里最初为 Perl 3 写的那些“Black Perl”到了 Perl 5 已经不能解析通过了,他倒是轻松了不少。
不过,拉里自己的文集很快被 Perl 诗歌女王 Sharon Hopkins 的光芒盖过。她写了大量 Perl 诗歌,并在 1992 年 Usenix 冬季技术大会上发表了题为“Camels and Needles: Computer Poetry Meets the Perl Programming Language”的文章(CPAN 可查)。除了是多产的诗人,Sharon 也是下面这首流传最广的诗歌的作者——它曾被《经济学人》和《卫报》刊登:
#!/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
另外,下面这段来自 comp.lang.perl 的讨论贴(发表于 1990 年 4 月 1 日)展示了“Black Perl”的例子,以及拉里自己的俳句。尽管其中有些内容看起来像胡闹,但它们确实能通过 Perl 解析——当然,通常不会做任何有用的事。
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
拉里自己写的一首俳句:
print STDOUT q
Just another Perl hacker,
unless $spring
古老的 Perl 从未停止创新。2002 年 7 月 18 日,Perl 5.8.0 正式发布,带来许多重大改进:
兼容性变化:
my 的属性改在运行阶段处理,而非编译阶段。REF(...) 取代 SCALAR(...):对引用的引用在字符串化时改为 REF(...)。use utf8 编译指令的作用域,而是直接与数据本身绑定。现在只有代码中用到 UTF-8 字面值时,才需要 use utf8,兼容旧版脚本。用词改变:《骆驼书》第三版里的“IO discipline”(IO 规则),现在改称“IO layer”(IO 层)。
不建议使用的特性:
dump 指令视同作废。exec(串列) 和 system(串列) 参数中的受污染数据会触发警告,未来版本会变成致命错误。tr///C 和 tr///U 是个意外,请改用 pack("C0", ...) 和 pack("U0", ...)。已知问题:
local() 与 tie() 的交互未明确定义。再次提醒,查看详细说明请读 pod/perldelta.pod、INSTALL 以及平台相关的 README 文件。
上一篇:Perl命令行应用程序详解
下一篇:Perl中的子程序学习笔记
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8