- 论坛徽章:
- 0
|
我的感觉是小的脚本,即用即写的工具用perl比较方便,可用的外部工具更多更可靠。但是对于大的脚本,perl语言会有一些奇怪的陷阱。
我之前做了一个1000行左右的淘宝宝贝搜索工具,用于检索w3c的路由器/交换机的商家及商品。当时首先考虑的是python语言,发现python的xml库在解析html中的非法字符时采取默认解析失败的方式处理,即一个字符解析失败整个页面不可用,这对于检索目录页出错时是不可接受的;我转用perl的xpath工具解析,没有发现不能解析的非法字符,所有页面解析的非常好,即使是非法字符也完全保留下来了(在execl表中显示的不是很好看,但是手工去除比较简单);性能上讲两者相差不大,一个页面的平均解析时间在0.5秒以上(暴汗,可能我选的工具确实弱了点)。
后来我又写了一个6000行以上的perl管理工具,使用很多的小函数、引用以及数组处理,发现很多意想不到的问题:
1. 如果在函数声明之前使用未定义的函数,如:
hello(@a);
...
sub hello(\@) {}
结果hello收到的不是一个数组的引用,而是一个数组,而且不会有任何提示;
虽然仔细看书的话会有提示,但是我还是花了很长时间才定位到这个问题;
2. $_是一个很大的陷阱,不要太依赖$_; 一个典型的例子就是在嵌套使用map/grep时原数组的内容会发生改变
perl -e '@a=("1", "2", "3"); @b= map {$_=1} grep {/1|2/}@a; print @a'返回的是113而不是123
这是因为$_是数组元素的引用而不是数组元素的一个拷贝,在多次传递$_时只要有一个地方修改了$_,都将导致原始的数组参数发生
改变;即函数式编程风格不可用,我只能老老实实的敲无数个foreach循环;而python的lambda函数就不会有这种问题;
或许我可以使用匿名函数或其它方式实现python的lambda,但是$_误用的风险却是存在的
3. perl的代码管理比较麻烦;我一向不大喜欢使用perl的类定义,所有的代码分散在不同的module中,但是在代码超过3000行时整个项目的代码已经很难理顺了;使用python的话10000行一下的工程还是很容易管理的;
我的经验就是如果不是以perl/python为职业的话,perl更合适,到目前为止perl的库更多也更稳定,实现一个功能单一的工具代价最小而且会相当的可靠;
否则,使用python更合适:在使用面向对象编程时10000行以下的代码还好管理,用perl写面向对象的模块总是有点别扭,而python相对自然很多(个人愚见);而且python中我还没有遇到类似$_的全局变量,代码执行通常都在我预期之内。
就学习曲线而言,有linux下bash编程经验的人入手perl相对轻松,有C边城经验的入手python代价很小;python更容易学习,但是我自己在学习python时懒得写代码,小的项目用python的面向对象风格相当累赘,远不如perl方便;perl语法复杂,但是就像bash一样可以使用短短几行代码实现大部分的日常工作。
目前我还是以perl/C为主要的工作语言,python作为日常使用的一种备用语言 |
|