November 8, 2007

复习 Perl

今天我去报名下一次托福模考,顺便去了书店转转——很长时间没关心计算机方面的书籍了,我唯一想看到只是《精通正则表达式》,也算是 “门当户对”。不过还是留意了一下Perl方面的书籍。《Perl入门》是一本小书,42块钱买来不值,于是我干脆发挥一下我在编程语言方面的功底,当场看完了事。

学习了更多编程语言原理方面的知识之后再来考察Perl语言果然有一些新感受。Perl关键字众多,但其实并不复杂:undef 好记还是 undefined?也没有 NULL 啦 nil 啦什么令人混淆的东西。空变量就是没定义,空表就是空表嘛。其它的关键字设定,如果你能忍受shell的fi什么的恶心东西那有什么理由不能忍受 Perl?

字符串用常量替换和括号代换体现是Perl的首创。学习前者的有PHP,后者有Ruby,不过弄来弄去还是不能取代Perl强大的上下文精神——到目前为止的语言都不能在字符串代换时展开列表甚至是展开列表切片就是一个证明。Ruby照抄了括号体系,但还是不敢抄Perl太多东西。在正则表达式里展开变量,IO描述符呢?它会和别的“纯”的语言一样露出叫你服从安排的嘴脸。

Perl的正则表达式已经红的发紫了——正如《学习Perl》一书骄傲的自夸——“很多语言和库都会以‘支持Perl风格正则表达式’作为卖点”。$` $& $' 这三个变量的设计更是叫我拍案叫绝!一方面,这三个变量对于实现不修改原数据的函数式编程来说是至关重要的,它可以把匹配过程表述为“过去,现在,将来”;另一方面,英语中常常使用`号作为应用开头以区别'x缩写形式,所以这种命名十分清晰,意思就是“开头,和,结尾”!(Perl使用的这种“命名推导”的体系和我早期设计的Mazy(t)是类似的:))

最后谈一点语义方面的东西。Perl的函数参数传递,本质上是只传递了一个变量(这与Ruby、Groovy之流的简单模仿具有核心上的不同),然后靠类似模式匹配的语法对它们进行命名。这个机制和我的Mazy (i)语言的做法是相同的;只不过我扩展了模式匹配的能力并把它提高到Lambda演算兼容的层次罢了。至于这种手法的优势——你不需要再去思考是用 max(a,b,c)还是max([a,b,c])甚至是apply(max,[a,b,c])了!Perl懒人们笑哈哈...由此可见,Python3 新加入的取代apply的语法,只能说明Guido大学课程没学好~~`


付:由Perl想到的Unix法则

不知道应该称为“法则”还是“通病”——概念充分实例化,尽可能地自圆其说。以Vim为例,普通模式,各种命令一套意思;换个环境或者开头控制符(这是Emacs吧?),命令不变,变成表达相反含义或对不同视角的对象应用合理解释后的命令;实在不能合理解释,怎么着也要凑一个上去。Perl也是这样。三种上下文标记,换成默认变量没法解释了,还要凑个类似的;散列怎么会有切片?《Perl入门》还强词夺理;while(<STDIN>) 这样的用法没意义,就凑一个方便的意义上去。不过还是那句话,“倒也门当户对”就是了。为了让大家能在看人打字手抽筋的时候安心喝茶,Larry Wall 用心良苦啊~`

No comments: