工作两年(三)–进入Regular Expression的世界

原载:http://blog.csdn.net/netcasper/article/details/368555

已经不记得第一次听说正则表达式是什么时候了,但是计算理论课让我对它有了一定的理解。而真正在实践中用到,还是从半年前开始,接手同事用Perl写的一个测试框架,那时其实一点Perl程序都不会写,就这样一点一点学起来,后来发现写Perl程序就是在构造一个个正则表达式,把字符串分解,然后再重新组合。

相对于编译器和emacs来说,我接触正则表达式的时间更短,而且相对于前两者来说,后者的资料更难找,所以学起来也更困难。后来听同事说有本《Mastering Regular Expression》,已经出到第二版了,不过国内没有卖的,正好他当时要去美国出差,就托他帮我带一本回来。拿到书时我感到很惊讶,在我看来概念简洁的正则表达式居然要用这么厚(496页)的一本书来讲解。书中的一段话解释了我的困惑,原来,实践中的正则表达式是基于理论的一种扩展,甚至已经跳出理论的框架,并非正则了。只不过没人为这个新发明的东西命名,仍然叫它正则表达式。由于变种很多,要讲清楚它们之间的相同和不同点,就很不容易。

这是一本相当好的书,将我一点点引入美妙的正则表达式的世界。每当我建立起信心,自以为已经学会了按照正则表达式的方式思考时,作者就会用一个精妙的例子教育我“路还长着呢”!可以说,正则表达式为我打开了一扇门,让我以一个全新的角度看待文本,它们已经不仅仅是一串字符流,而且拥有一定的结构,可以对其进行分解、提取和加工。那种感觉,大概就像在外科医生眼里,病人已经不再浑然一体,而是一个各个组织有机结合形成的系统。学习正则表达式让我明白了,打印信息也是有学问的,要巧妙地设计布局,使得输出信息方便地被正则表达式处理,这样可以使很多工作自动化,减少工作中的负担。

除了Perl之外,还有很多程序支持正则表达式,emacs就是其中一个。在了解正则表达式之前,我几乎没有用过任何涉及到这方面内容的功能,后来才发现,我忽略的,是一座宝藏。

书还没有读完,学习更要继续,今后要多加实践,而且打算在熟练运用的基础上再看几种正则表达式处理引擎的程序,加深理解。

工作两年(二)——进入emacs的世界

原载:http://blog.csdn.net/netcasper/article/details/364258

emacs是我开始系统学习的第一个自由软件,也是到目前为之我用得最熟的软件。

第一次听说emacs是在读研的时候,那篇文章的内容都忘光了,只记得仿佛是说emacs是专业程序员的必备工具之一。当时也就是留了个印象,没太当回事,上班后,因为项目要求源代码文件格式必须为unix文件格式,而且每个人给了一个SlickEdit的license,推荐使用。后来我发现项目元老们都是用emacs的,就尝试着学起来,哪知一发不可收拾,完全被emacs的世界给迷住了。

其实,emacs的学习曲线在开始阶段是很陡的,也就是说学了很多也不见什么效果,一位元老就跟我说过,当初他从vi转向emacs时有6个月时间什么也干不了(估计有夸张的成分)。所幸作为公司的新人,开头两个月处于学习阶段,没什么任务压下来,看文档看腻了就学学emacs,等后来接任务了就边干边学,直到后来越用越熟练,用到的功能越多,现在可以说完全离不开emacs了。

在用emacs之前我都是用Delphi或VC++自带的编辑器,那时对编辑的理解就是敲键盘,把程序一个字母一个字母地敲进去,从来没想过它还能提供其它功能。emacs非常重视编辑,认为编辑是程序员最频繁的工作之一,因此提供了丰富的操作供程序员使用。这些功能中有些是emacs独有的,有些也被其它编辑器——如vi等——支持,但往往都是Windows下的编辑器所缺少的。比如说以单词为粒度遍历程序或文档;可以按组合建(M-d)直接删除一个单词,就像用DEL删除一个字母一样快;又比如所有的剪切和复制内容都被保存起来,然后通过C-y粘贴最后一次剪切或复制的内容,通过M-y取出以前的内容,等等。一度让我赶到非常爽的命令是M-x comment-regionM-x uncomment-region,它们可以快速将大段代码注释起来或去掉注释,并能根据不同的语言选择不同的注释符号,如C++程序会用//,shell和Perl程序会用#。

编辑和浏览是emacs最基本的功能,在此基础上,配合emacs提供的丰富接口,使其成为非常强大的开发工具。难怪有人开玩笑说某些人甚至就生活在emacs中,因为在emacs里可以做任何事:-)。我现在用得最多的就是与cvs的接口和各种diff功能。emacs提供两个包调用version control工具,它们是VC和PCL-CVS,一般操作单个文件用VC,操作整个CVS tree的时候使用PCL-CVS。emacs之所以方便是因为它将cvs各种命令显示的信息放在buffer里,这样,不仅可以使用emacs提供的最基本的浏览和查找功能,而且emacs会做一些高亮处理,使得信息主次分明,利于浏览。如果是在shell下运行命令,像log或diff显示的信息都比较长,不利于查看,更没法查找,除非你把输出重定向到一个文件里,再用编辑器打开。另一个非常有用的命令是M-x vc-annotate,这个命令将当前文件里每一行的信息都显示出来,例如最后一次修改的日期、版本号和修改者,我一般在看代码有不懂的地方就运行一下这个命令,然后就可以找相应的人去问了。参加了大项目才知道,version control和diff对一个程序员意味着什么。

emacs在某种程度上也可以看做是个IDE,因为你可以在emacs里编译、调试程序。编译命令是M-x compile,然后你会看到缺省的命令是make -k。如果makefile不和当前源程序在同一个目录下,可以稍加修改,把make -k改成cd some/directory && make -k。编译信息会显示在一个单独的buffer里,如果编译出错,也可以通过点击出错信息直接定位到错误的源程序所在的行。如果程序是用gcc编译的话,也可以在emacs里调用gdb调试,因为我们的程序不是用gcc编的,所以没怎么用过调试的功能,尝试过一次,感觉和在命令行下调用gdb差不多,好处仍然是信息都显示在buffer里,可以使用emacs强大的查找和浏览功能,而且源文件显示在单独的buffer里,不像命令行下看到的内容有限,经常要调用显示命令。

emacs还有很多强大的功能,再介绍几种我用过的。Calendar/Diary功能、方便画字符图形的picture-mode、可以收mail看newsgroup的GNUS等等,甚至可以播放mp3!emacs之所以拥有如此众多的功能,是因为它带有一个解释器,可以解释执行Emacs Lisp程序,除了少数原语是用C实现的外,绝大多数功能都是用Emacs Lisp语言实现的,而当某人想要某种功能而emacs里又没有的话,他就可以自己实现,然后贡献出来,造福大家。你可以在http://www.emacswiki.org/找到很多有趣的东西。

其实,emacs调用了很多外部程序来实现功能,所以,在学习emacs的同时,我也学会了许多其它的自由软件,对我来讲,这是一个非常美妙的学习过程。过年回家的时候,我把Introduction to Emacs Lisp和The Emacs Lisp Reference Manual通读了一遍,虽然没有全部看懂,甚至有些内容都没记住(Lisp实在是一种非常不同的语言),但是至少可以看懂一些简单的程序了,希望在不久的将来能用上自己开发的功能。