我为什么讨厌Perl

shhgs 2006-01-08 04:15:40
我为什么讨厌Perl

如果你是一个不懂Perl的人,如果你想知道是不是应该学Perl,
那么这篇文档就是给你准备的。不管你最后的决定是什么,
花时间读读这篇文档肯定是值得的。判断要由你来给,
我这里给出的只是事实。

1. scalar, list
Perl号称按照人类语言设计。英语里有单数和复数之分,
因此Perl设置了两种变量,scalar和list。
应该说,这并不坏,但问题出在

$a = @list

不管Perler们怎样解释,这种语法肯定是错的。

当我们赋值的时候,我们隐含地就认定两者相等了。
也就是说,执行完$a = @list之后,$a应该就是@list。
而相等又意味着自反和传递。也就是说如果a==b,那么
b==a;同时如果 a==b,b==c,那么a==c。

赋值就意味着相等,相等就意味着自反和传递,
这两个规则Perl也是承认的,
但是,当我们考察$a=@list的时候,它崩溃了。

当$a=@list之后,$a==@list吗?@list == $a吗?
如果$a = @list; $b = @list2; $a == $b; 请问@list == @list2吗?

对这种为贪图少敲两个键而乱用运算符造成逻辑上的矛盾,
我几乎是本能地产生反感的。虽然要不是为了写这篇帖子,
我未必能总结出上面那番道理。但是作为一个程序员,或者说作为一个想做程序员的人,
你虽然可以不知道它错在哪里,但是你必须能意识到它错了。


2. list, hash, scalar 和 一致性
或许我们应该抱着实用主义的态度接受$a = @list,告诉自己$a = @list的时候,
实际上是在去@list的长度。但非常遗憾,Perl有它自己的逻辑,
一种正常人无法理解的逻辑。

Perl的hash和list是可以任意转换的。这也无可厚非。但是

%hash = (
US => Washington,
China=> Beijing,
British => London,
France => Paris,
Russia => Moscow
);

@list = %hash;

print ($a = @list);
print "\n";
print ($a = %hash);
print "\n";

如果说我可以自欺欺人地认为$a = @list是在取@list的长度,
那么现在我已经不知道该怎么骗自己了。

3. 上下文
Perl引入了上下文的概念。如果这不能算是不负责任的话,至少也是大胆地过了头。
上下文是一个很主观的概念,同样一句话,你理解的上下文和我理解的上下文就可能不一样。
如果是人在交谈,那我们可以停下来,问一下,
但程序又怎么能停下来。
所以,如果程序员的理解错了(天晓得到底是谁对谁错),那这个bug就太难找了。

$a = 1;
print $a +1;

谁都知道,这里我们期望的是程序打印出2,但实际上,
Perl会认为$a是一个filehandler。
这里只是因为有了print,$a才被理解为fliehandler,
在其他很多地方(我不敢说任何地方,我不知道有没有人敢说这两个字),
$a +1都表示给$a加一个1。

类似这种陷阱,Perl肯定还有很多。但是你无法事先预知,只有碰到了才知道,
或者说碰到了也不知道,只有排错排出来之后才知道。
于是你该知道,万一碰上一个这种错误,会有多麻烦了吧。

4. 普适性的缺失
人在学习的时候并不是仅仅靠记忆,更多的是依靠逻辑推理。
比如上例,$a = @list是在取@list的长度,
而@list = %hash是把%hash的键和值放到@list里面,
所以正常人的反应是,$a = %hash应该是取%hash里面有几对键值,
或者%hash里面总共放了多少个键和值。但Perl给的却是一个莫名其妙的3/8。

我不知道这个东西表示什么意思,我也不知道它是怎么来的。
我只知道它是在故意侮辱我的智商。

不知道Perler又会给什么解释,但我知道,这种解释必定是我无法接受的。
我的推理没有错,所以如果他们能推理出相反的结论,那么他们必定错了。
而错了还这么振振有辞,还这么理直气壮,我无言 。。。

Perl的语法的混乱是非常明显的,你只要稍微留心一下就能发现很多。
这是由它的哲学决定的,是它发展的必然产物,所以我估计随着时间的推移,
这种地方会越来越多。西谚有云"Philosophy matters",此诚至理名言,果不我欺也。

5. 虚伪的自由
Perl号称是一种自由的语言,是一种可以用多种方式写同一条语句的语言。
很多人也真是看中这一点才去学的Perl。但是作为一个理性的人,
你应该有自己的主见,你应该知道什么才是真正的自由。

自由,首先是一种权利,是一种按照自己的思路,理解问题、解决问题的权利。
其次,自由是一种表达的自由,是一种无拘无束将自己的观点传播出去的自由。
遗憾的是,这两条Perl都不能满足。

Perl有它的思路,比如$a = @list,$a = %hash,
比如print $a +1。要理解它,你必须抛弃自己的思路,必须接受Perl的逻辑。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
对一个真正酷爱自由的人来说,这是一件无比痛苦,无比屈辱的事。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


再看第二条,表达的自由。程序员的思想就是程序,就是算法加数据结构。
而这两者和语言是没有关系的。就像苏格拉底和庄子都是伟大的哲学家,
但他们的哲学思想同他们用哪种语言来写书是没有关系的一样。
但如果他们要把他们的思想传播出去,就不得不借助语言。
因此,如果编程语言的表达能力不强,再好的算法也实现不了。
从这个意义上说,汇编比机器语言自由,C比汇编自由,Java比C自由,
而Python比Java自由。

再来看Perl,它在这个方面,做得并不出色,甚至很差。
Perl不是一种表达能力很强的语言。它带了很浓的shell痕迹。
比如函数的参数、返回值,文件测试,以及那些莫名其妙的符号。
至于OO和reference,更是古怪和滑稽。因此,写Perl代码的时候,
我不得不把很大一部分精力放在语言的细节上,
这跟Python“思路到,代码出”的感觉相比,差得实在太远了。

写尚且如此痛苦,何况是读。Perl的代码是出了名的乱,再加上
"there's more than one way to do it"的motto,真是看了就让人头大。
有时我甚至会想,如果把Perl代码里的空格全部去掉,
是不是会被人认为是base64编码的文本。

最后我想用两个比喻来形容Perl和Python所定义的自由。

在一个叫Perl的小镇,有一条法律。任何人都可以在任何地方涂鸦。
墙上,马路上,桌子上,甚至别人的衣服上。但是它涂鸦的内容只能是
“Larry万岁!”

在一个叫Python的小镇,也有一条法律。居民只能到市政厅的公告栏上帖帖子,
帖子必须用A1白纸,必须用Courier 20号字体打印。但是帖子的内容不限,
你甚至可以写,“Guido下台!”

什么是自由?你自己看。

6. 态度决定一切
Perl有如此之多的问题,但这还不是最糟的,更糟的是Perler的态度。
看看Perl是如何为它的复杂性辩解的。

---- http://www.perl.com/pub/a/2003/06/25/perl6essentials.html ----

The Waterbed Theory of Complexity

The natural tendency in human languages is to keep overall
complexity about equivalent, both from one language to the next,
and over time as a language changes. Like a waterbed,
if you push down the complexity in one part of the language,
it increases complexity elsewhere. A language with a rich system of
sounds (phonology) might compensate with a simpler syntax.
A language with a limited sound system might have a complex way of
building words from smaller pieces (morphology). No language is
complex in every way, as that would be unusable. Likewise,
no language is completely simple, as too few distinctions
would render it useless.

---- http://www.perl.com/pub/a/2003/06/25/perl6essentials.html ----

这是彻头彻尾的狡辩。Perl只是在模仿人类语言,而且是一种很初级的模仿,
它根本上还是一种编程语言。编程语言根本就不存在所谓的waterbed theory。
汇编在各个方面都比机器语言简单,C比汇编简单,。。。,因此Perl也可以,
而且完全应该做得简单一些。

我从来没有见过比这更无耻的狡辩。抱有这种心态,哪怕Perl到了60版,
还会是一样的糟糕。
...全文
22373 139 打赏 收藏 转发到动态 举报
写回复
用AI写文章
139 条回复
切换为时间正序
请发表友善的回复…
发表回复
踏岸寻柳 2006-07-07
  • 打赏
  • 举报
回复
说的很不错!

最初接触Perl的时候,我觉得那真是一个不错的脚本语言。
可是,慢慢的,当接触越来越多时,我也开始讨厌它了。
含混晦涩的语法,莫名其妙的用法,令我却步。
myome 2006-06-29
  • 打赏
  • 举报
回复
我们为什么不站出来?这就是真正Perler的态度,口水吧,咱依旧享受Perl带来的那种激情!
feny911 2006-06-10
  • 打赏
  • 举报
回复
mark
myblind 2006-04-27
  • 打赏
  • 举报
回复
S.B.们,我用C一行就搞定了:去掉所有的0x0D, 0x0A字符
jianleon 2006-04-14
  • 打赏
  • 举报
回复
好长,见识了一些牛人
Edison1024 2006-04-03
  • 打赏
  • 举报
回复
仔细看了楼主的文章和所有回帖,真的要感谢楼主,我想真需要作应用开发的话还是选python,至少保险一点,呵呵。
脚本家族里面我只对jscript略为精通,其他几乎一无所知,主要用于webgis的浏览器前端开发(ajax那套了)。
从去年起就有作开源webgis的打算,拟用用python和C++作服务端,请楼主多多指教。
my blog
http://edison1024.cnblogs.com/archive/2006/04/02/365005.html
Edison1024 2006-04-03
  • 打赏
  • 举报
回复
我靠,都登上程序员杂志了,慕名而来,刚好解决我最近的困惑。

看贴到一半就把前几天刚装的ActivePerl给干掉了,决定搞python。
zhzhp 2006-03-06
  • 打赏
  • 举报
回复
无论如何,读完这个帖子让我用了将近1小时,受不了。
我原来懂一些perl。不过现在想学习学习Python玩玩,看看到底Python有多好。

hax 2006-03-02
  • 打赏
  • 举报
回复
总算抽时间看完了。

总的来说我是赞同楼主的。俺的语言背景是精通javascript,java,xslt;熟练c#,groovy,nice;会一点python,ruby,haskell,不太懂lisp和perl。

我认为楼主不满perl是很有道理的。一个好的设计必然要满足以下特性

# Simplicity
# Correctness
# Consistency
# Completeness

楼主攻击的焦点恰恰是一致性(Consistency)。对于大多数人来说,学习并非一件必然困难的事情,困难的是学习一个内在不一致的体系。如果有太多特例、约定,那就非常痛苦。比如经过很少的学习,我就能基本看懂smalltalk或scheme的程序,虽然他们的语法我以前完全陌生,但他们的设计是非常一致的。

还有关于==的问题,我认为楼主说的是对的。就算是弱类型语言也不能破坏三性(自反性、对称性、传递性)。除了perl之外,我还不知道有其他语言是破坏这三性的。有人举c++重载的例子,根本就是乱弹琴。如果不是为了故意搞个别人看不懂的体系,则运算符重载应该遵循一些约定。正如java对于equals的约定。

对于生产性语言(而不是研究性语言)来说,直白性也是非常重要的。比谁的代码短没有什么意义。还有全用.*(@等符号的语言呢,但是写出来的程序有人看得懂吗?要知道读程序比写程序更重要。除非你写出来就不会再维护。。。

虽然我不太懂perl,但我确实知道perl很容易用来写出让人看不懂的程序,呵呵。其实我看过一些perl代码,几百行,大约能看懂50%左右,当然主要因为其功能目标比较简单,宏观上了解后,微观上连猜代蒙,而且估计写的人基本没有用什么很高深的技巧,就这样也才看懂50%。而对于同样程度的smalltalk和scheme来说我大约可以看懂70%以上。


所以我支持楼主。perl不是一个好语言。当然java,c#也都不是好语言。就我目前的认识而言,ruby,nice,haskell都是很好的语言。js也设计的非常不错,不过有点早产不良还有点小儿麻痹,嘿嘿。
ttkk1024 2006-02-27
  • 打赏
  • 举报
回复
这个问题还在讨论啊。都是牛人啊!在家看python呢,感觉很爽,我都把它当小说看了,不忍心把它全看完,偶尔去limodou的blog瞧瞧,算是散散心!
limodou 2006-02-22
  • 打赏
  • 举报
回复
如果你学python可以找我,但不是指点,互相交流。在 python.cn 和 http://groups.google.com/group/python-cn/ 邮件列表中有许多的人,气氛很好,也很热闹,欢迎加入一同学习。
yibotiemen 2006-02-22
  • 打赏
  • 举报
回复
觉得不错,楼主挖坑引来不少专家是在是高。高手平时是不出手的,也只有你这样他们才会出手。

有空给你分,呵呵。

但是同志们啊,我是个万金油,带p的语言,带c的语言包括带java的语言也学了好几种,虽然不精,但我觉得perl还不是太坏阿,有很多相同之处,能够和其他语言相互印证,是不错的语言,我打算学好它。
同时也奉劝楼主,你不知道一个人是好人还是坏人的时候不要把它假想为坏人,应该多去了解,虚心学习。

发言完毕,以后请各位高手指点我学perl,python
rjhome 2006-02-20
  • 打赏
  • 举报
回复
垃圾帖!鉴定完毕。
BeginnerCpp 2006-02-18
  • 打赏
  • 举报
回复
后面的讨论气氛不错。

limodou 2006-02-15
  • 打赏
  • 举报
回复
AllCHN 说得不错。这其实是工作与理想或者说工作与兴趣之间的冲突。正如你所说,比如我学了许多东西,我很想把东西做得既漂亮又好用。但想实现这样的目标可能会与和项目进度相冲突。在我周围,绝大多数人只做工作上要求做的事,因此他们的目的只是为了完成任务,他们不会也不愿意多花些时间在代码重用与额外的学习上。

首先谈一下OO。一个良好的设计不一定非要使用OO,这是必然的。只不过现在OO的设计已经是一种很自然的方式。这就是一个习惯与熟练度的问题。如果他很熟OO,自然不会感到有多困难。因此是否使用OO一方面是项目的要求,另一方面是个人的能力。在我做过的项目,以前都是用C写的。但有人感觉不好,希望使用C++重写。但当时的情况是,系统运行稳定。再加上许多人并不熟悉C++,因此这种建议也只能落空。是否采用OO可能原因有很多。但并不是说使用OO就不好。还要看人。如果大家都很熟,那就很自然。如果就你会,还是算了吧。一个项目要考虑团队的整体水平。项目的成功与是不是使用OO没有必然的联系,它与多方面因素有关系。而且一个成功的项目也不一定代码漂亮,设计优良,还要看成功的标准是什么。但这个与本主题关系不大。

再谈一谈工作与理想与爱好

我平时自学Python,而且这个与我的工作一点关系也没有。我学了有几年了,至到现在公司里会Python的仍然只有我一个。但通过学Python我在网上认识了许多人。因此爱好与工作有时可能是无关的。而且我的体会是,一旦爱好真的变成了工作,也许就没有很多的乐趣了。我个人感觉,理想与爱好是个人需要长期坚持的事情。特别象IT行业,许多都在变化,而且需要快速的适应,不仅要求你能够快速学习,还需要有一定的积累。一个人如果没有积累的话,那最后只能是落在别人的后面。而这种积累可能完全是出于自身的角度,而不是公司的有意引导,这是一个现实。

一种语言带来的不仅仅是语言本身,还有它后面的许多的项目,这些才是真正有益的东西。在学习的过程中你会学到许多的设计思想,解决方案,使用范例和技巧,等等东西。还会使你的眼界开阔。同时如果你进行某些项目,参与某些项目,更是一个很好的锻炼和成果经验的积累。不过这些东西因为与工作无关,也许会在以后发挥作用,也会只能算是业余爱好。但你仍然可以利用你的知识在工作之外做出一番事业或贡献。当然如果想实现这一点,就不能仅仅是会用一些,简单的应付就够了。要真的下工夫,要做好长期学习的打算。因此这里面就有一个选择问题。特别是对于初学者,到底学什么的问题。这个问题对于已经学过的人可能非常容易,回答也可以是多种多样。最好的方法其实还是自已每个都学一下,自已去比较。别人的永远是参考。有些人的意见如果你有体会你会认为它说得很对,有些人的意见你没有体会,或已经接受一些理念或自已有更充分的理由,自然你会反对。语言学得多不是坏处,这样才真正有比较的发语权。但少也有少的好处,那就是可能更精。在学习的过程中也许一两种足够了,也许你还会学习更多的语言,只能有能力和精力都是好是。

如果你个人酷爱编程,你会一直学下去,而不仅仅是为了工作。如果只是为了工作,那你只能是工作上要什么你学什么了。这样就没有什么可选择的了。对于我,学Python完全是出于个人的兴趣。而且现在也已经开始有意识地使用Python一些技术一些产品在项目开发中做一些尝试。不能不说也是一种好的趋势。

学习语言的原因多种多样,如果是因为工作其实大可不必讨论,你基本上没有选择的余地,如果是个人兴趣正如我上面所言,自已去体会。如果问我个人的感受,我偏爱Python,但你要学Perl或其它什么的话,我不会有意见,你是你个人的事,我不懂,也没有什么建议。
JoyerHuang_悦 2006-02-15
  • 打赏
  • 举报
回复
大家聊得算深入一些了。哈哈。
shhgs 2006-02-15
  • 打赏
  • 举报
回复
原则不是用来妥协的。

错误就是错误,虽然可能会有各种原因,但这不是原谅它的理由,更不能说因为这些原因,这个错误就不再是错的了。

错误就是错误,我可以容忍它,但仅仅是容忍。要我自觉自愿为他辩护,为它粉饰,我做不到。

至于ALLCHN说的,用不着计较实现的方法或思想,读者自行判断。因为shhgs不是职业程序员,写程序只是我的业余爱好,没有生存压力所以也就没办法体会到程序员的苦衷。不过shhgs觉得,至少在学生时期,应该对自己的代码负责一点。要求高一点,不要觉得能跑就万事大吉了。
AllCHN 2006-02-15
  • 打赏
  • 举报
回复
不知道什么感觉,总之觉得讨论这些东西挺无聊的

不知道楼上有几位是在 IBM 工作,又有几位在 Microsoft 工作。按 shhgs() 的牛劲,估计是在哪个大公司高就,所以如我等平头百姓是无法理解到底的。

谈到程序的思想,突然有点感悟。

程序的思想无论多么丰富,其实还是要服从于要求的。
记得80年代,我们单位有个清华的老牌毕业生,当时是高薪聘请来的,有几个项目不太成功,后来就没有太多的机会了。当时正是大唱“提高知识分子待遇”的时候,抱怨的人很多,不能或者没有转化为生产力的知识终究是没有用处的。我当时刚刚毕业,其实挺有限的知识,而且我并非计算机科班,反而得到许多机会。当时我的感悟是: 如果一个人的知识能够带来经济效益,待遇自然就提高了。

近几年来,我做过一些项目,有的项目需要招聘计算机方面的人才,见过很多专业方面的大学生所展示的东西。我承认,他们很有思想,比如他们对 OO 很内行,也知道 Java, FrameWork 等等,可是却缺乏很多非常基础的东西。

在一些大公司里,团队协作,规范的程序设计风格是必须的。可是,现在的情况则远不是学校能够提供的,比如,由于就业形势严峻而只能在中小公司里工作,或者可能根本就没有足够的资历证明你可以完成一个大的项目,你就可能必须从一些小的项目开始,这些项目不是要求你把程序的思想展现的多么出色,大多是要求你在最短的时间实现最简单的想法。很多情况下,比如一些民用产品,你根本就没有一个做 OO 设计的平台,你可能需要用 C 语言甚至于汇编语言完成一段代码,实现一种功能,这个时候,一个完整的流程、最简单的设计、最少的时间投入是项目成功的关键,你仍然可以做 OO,但是,最终会被淘汰。

CSDN 曾经有一个关于程序员就业和薪水的帖子,很长,也许现在还可以找到,这个帖子说明一点: 程序员并不总是在作自己喜欢的工作,也并没有得到自己期望的回报。问题并不在于环境,我们的一些程序员太把自己当会事了,对环境和要求的适应能力有些欠缺。

我没有在 IBM、Microsoft 这样的大公司干过,我所学的东西都是项目需要的时候,能够用尽可能短的时间学会它。

在一些中小公司里工作,适应项目的需要,学习必需的东西,尽可能选择喜欢的方式,把项目做好是最重要的。有时候是老总,有时候是项目负责人,有时候是你自己,并不关心项目是如何实现的,也不管你有多少思想,满足用户的需求,把你的劳动转化为效益,这样公司就离不开你,那么所有都会好起来。

用 C 也好,用汇编也好,用 VB 或者 Perl 也没什么不可以,只要环境和要求允许就行,用不着计较实现的方法或者思想。

借用这个帖子的热度吧!顺便说一句,我所在的公司从事的项目是非常宽的,从单片机的设计到地理信息网络平台GIS(Autodesk MapGuide),我目前的工作语言包括汇编语言、C 语言,VC/VB,ASP, Perl 等等,在一段时间之后,我会需要一个合作伙伴,也许,这里会有我期望的人吧!
du51 2006-02-11
  • 打赏
  • 举报
回复
谢楼上了.
shhgs 2006-02-11
  • 打赏
  • 举报
回复
Python文档里面就有一个教程,英语过关的话就一个周末解决了。当然,真正要写出Pythonic的代码,还得练一段时间,也就两个月吧。

如果是Absolute beginner,可以看看A byte of Python,有中文的翻译版

此外,Learning Python也很不错。

我第一本Python的书是How to think like a scientist,虽然网上评价一般,但我个人觉得还是写得不错的,只是老了一点,Python 2.0的。

此外,推荐三本书,学会Python之后提高用的。
Dive into Python,进阶读物,强烈推荐。
Python in a nutshell, Python Cookbook,这两个series的书的作用相信不用再介绍了

最后,到Python.cn上去加入邮件列表。很热闹,基本上有问必答,比在这里问要强得多。
加载更多回复(119)

37,716

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧