时势造英雄
为了理解Perl为什么用这样的样子定义(或者为什么不定义成其他的样子),必须首先明白为什么会有 Perl。所以,先挖掘一下布满尘灰的历史书....
退回到1986年,Larry是一个系统程序员,在做一个多层安全的广域网项目的开发。他负责这么一个系统,这个系统由西海岸的三台VAX和三台sun机器,通过一条加密了的1200波特的串行线路和东海岸类似配置的系统连接组成的,因为Larry的主要工作是支持(他不是该项目的程序员,只是系统专家),所以他就有机会利用他的三种优点(懒惰,不耐心,和狂傲)来开发和提高所有有用的工具——比如rn,patch,和warp。(注:正是在这个时候,Larry被划入了‘’计算机动物‘’的范畴,这是以那些人的不可遏止的‘’再加一个特性‘’的渴望为基础评判的,因为这种行为几乎成了生物必须。毕竟,如果生活就是太复杂的话,难道程序就不会吗?尤其是想rn这样的程序,它真是应该当作一个高级的人工智能项目来看待,因为他们就可以为你阅读新闻。当然,有些人已经在说patch程序太复杂了。)
一天,Larry刚刚把rn撕成碎片,把它一片一片地放在他的目录里,大管理员就跑进来说, ‘’Larry,我们需要一个管理配置,用它控制所有六台VAX和六台sun。我们想在一个月里就要它。你做一个吧!‘’
所以,从不逃避工作的Larry,开始问自己做一个两个海岸的CM系统的最好的方法是什么,它必须不用自己从头开始写,并且还可以查阅两个海岸的问题报告以及核准和控制。他想到的答案只有一个词:B-news。(注:也就是Usenet传输软件的第二种实现。)
Larry着手在这些机器上安装了新闻软件并且增加了两条控制命令:一条‘’append‘’命令用于向现有的文章追加内容,和一条‘’synchronize‘’命令保持两个海岸的文章数目相同。CM可以用RCS(版本控制系统)做,而核准和控制可以用新闻和rn来做。
然后大管理员让他生成报告。新闻是在核心机器里的一个独立的文件里维护的,里面有许多文件间的交叉引用。Larry的第一个反应是‘’用awk。‘’糟糕的是,那个时候的awk无法做到以文件里的信息为基础打开和关闭多个文件。Larry不想编写一个特殊目的的工具。结果就是产生了一种新的语言。
最初这种新的语言并不叫Perl。Larry和他的同事及亲友(Dan Faigin,写这段历史的人,和Mark Biggar,他的妻弟,在初始设计阶段帮了大忙)交换了一大堆名字。实际上Larry考虑并抛弃了字典里的所有三个或四个字母的单词。最早的名字是‘’Gloria‘’,以他的宝贝(和老婆)命名。但他很快就发现这样会产生太多家庭混乱。
然后名字就成了‘’Pearl‘’,它变成了‘’Perl‘’,部分原因是Larry看到另外一种叫PEARL的语言的介绍,但最主要的原因是他懒得总要敲五个键。当然,这样Perl就可以用做一个四字母的词。(不过,你会注意到,这里有以前首字缩写的残余: ‘’Practical Extraction And Report Language‘’。)
最早的Perl没有l那么多的特性。那时候有模式匹配和文件句柄,有标量,有格式化,但是很少有函数,没有相关的数组,而且只有一个实现得不怎么样的正则表达式,(从rn借来的)。手册页也只有15页。但是Perl比sed和awk快,并且开始在该项目的其他应用里使用。
但是其他地方又开始需要Larry 了。有一天另外一个大经理来了并且说:‘’Larry,给R&D做支持。‘’并且Larry 说,好吧。他带上Perl并且很快发现它逐渐成为系统管理的好工具。他借来Henry Spencer漂亮的正则表达式软件包并且把它变成更有男人味(不过Henry可能不会愿意在正餐的时候考虑这些特性。)然后Larry增加了大部分他想要的特性,以及一些别人想要的特性。然后它就把Perl发布到网络上。(注:更让人吃惊的是,他先后工作于喷气推进实验室(JPL),然后是NetLabs? 和Seagate之后,仍然不断发布新Perl。其他人做了大部分工作,而 Larry假装为O‘’Reilly & Associates(一个小公司,印刷关于计算机和相关事物的小册子。)其余的就是历史了。(注:而这些东西,是历史的一个注解。当开始Perl的工作的时候,Larry已经把rn分解成碎片,并且准备做一次全面的重写。但因为他开始在Perl上干活,所以Larry没有再碰rn。它仍然是碎片。有时候Larry说要用Perl重写rn,但是从来没当真。)
然后事情的发展就是这样的:Perl 1.0在1987年十二月十八日发布;有些人仍然很认真地对待Perl的生日。Perl 2.0在1988年六月发布,并且Randal Schwartz开始了‘’另外一个Perl黑客‘’的签名的传奇。在1989年,Tom Christiansen在巴尔的摩Usenix拿出了第一个公开的Perl教程。1989年十月的Perl 3.0开始,这门语言第一次以 GNU公众版权(GPL)发布和分发。
1990年三月,Larry 写了第一首Perl小诗(见下一节)。然后他和Randal写了本书的第一版,The Pink Camel;该书在1991年早期发行。然后Perl 4.0就立即发布了;除GPL之外,它还包括了Artistic License(艺术版权)。
万众期待的Perl 5在1994年十月发布。这是一个完全重写的Perl版本,它包括对象和模块。 Perl 5的到来甚至连The Ecomomist杂志都提到。到了1995年,正式向Perl社区引入CPAN。在1996年,Jon Orwant开始出版The Perl Journal杂志。在长时间的猜测之后,本书的第二版,The Blue Camel,在那年的年末出版。第一次O‘’Reilly Perl大会(TPC) 1997年夏季在加州San Jose举行。重大事件几乎是每天都在发生,所以,关于历史的其他部分,请检查CPAST (Comprehensive Perl Arcana Society Tapestry (history.perl. org))上的Perl纪年表。
Perl 诗歌
在助手框里的诗歌的仿制品是在1990年的四月一日愚人节张贴到Usenet上的。不加注释的把它放在这里,只是想表示典型的编程语言的隐喻真的是多么让人作呕。对所有有文学价值的东西大概都是这样的吧。Larry在最初为Perl 3写的那些‘’Black Perl‘’到了Perl 5不能分析通过之后,真是感觉轻松许多。
不过,Larry自己的文集很幸运地被Perl诗歌的王后,Sharon Hopkins的光芒所掩盖。她写了相当多的Perl诗歌,以及一些她在1992年Usenet冬季技术大会上拿出来的关于Perl诗歌的文章,标题是‘’Camels and Needles; Computer Poetry Meets the Perl Programming Language‘’。(这篇文章可以在CAPN的misc/poetry. ps找到。)除了是最多产的Perl诗人之外,Sharon还是下面这首诗歌的作者,这首诗是发表得最广泛的一首,并且曾经在 Economist和Guardian杂志上刊登:
#!/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), xXyz (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
Perl Poetry
Article 970 of comp.lang.perl;
Path; jpl-devvax!pl-dexxav!lwall
From; lwall@jpl-dexxav.JPL.NASA. GOV(Larry Wall)
Newsgroups; news.groups,rec.arts.poems,comp.lang.perl
Subject; CALL FOR DISCUSSION; comp.lang.perl.poems
Message-ID; <0401@jpl-devvax.JPL.NASA. GOV>
Date; 1 Apr 90 00;00;00 GMT
Reply-To; lwall@jpl-devvax.JPL.NSAS. GOV(Larry Wall)
Organization; Jet Prepulsion Laboratory, Pasadena, CA
Lines; 61
It has come to my attention that there is a crying need for a place for people to express both their emotional
and technical natures simultaneously. Several people have sent me some items which don‘’t fit into any
newsgroup. Perhaps it‘’s because I recently posted to both comp.lang.perl and to rec.arts.poems, but people
seem to be writing poems in Perl, and they‘’re asking me where they should post them. Here is a sampling;
From a graduate student (in finals week), the following haiku;
study, write, study,
do review (each word) if time。
close book. sleep? what‘’s that?
And someone writing from Fort Lauderdale writes;
sleep, close together,
sort of sin each spring & wait;
50% die
A person who wishes to remain anonymous wrote the following example of "Black Perl". (The Pearl poet
would have been shocked, no doubt.)
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
I tried that, and it actually parses in Perl. It doesn‘’t appear to do anything useful, however. I think I‘’m glad,
actually... I hereby propose the creation of comp.lang.perl.poems as a place for such items, so we don‘’t clutter
the perl or poems newsgroups with things that may be of interest to neither. Or, alternately, we should
create rec.arts.poems.perl for items such as those above which merely parse, and don‘’t do anything useful。
(There is precedent in rec.arts.poems, after all.) Then also create comp.lang.perl.poems for poems that
actually do something, such as this haiku of my own:
print STDOUT q
Just another Perl hacker,
unless $spring
Larry Wall lwall@jpl-devvax.jpl.nasa. gov