最近看了看Perl,主要是想看看Ruby都从Perl那拿来了些什么。同时,也是我学习Perl的一篇笔记。
为什么大家都是Perl的代码丑陋,是什么导致了Perl程序晦涩难懂,Ruby中又是如何取舍这些元素的呢?我认为Perl社区追求更少代码的风气助长了大量使用预设变量的风气,从而导致了Perl代码的晦涩。
下面的每个Perl的例子总伴有Ruby的对照。
Perl的理念-条条大道通罗马「There is more than one way to do it」。
都说Perl简单、“万能”、快速、丑陋,Ruby咋就这么慢呢?
Perl的前身语言:C, awk, sed, sh, 以系统管理为目标, 强调使用性而不是美观。
- 断句
Perl的语句是以分号";"作为分隔,而Ruby是以换行。所以Ruby的代码中鲜见分号。
- 输入输出
Ruby的输出(print)似乎就是从Perl那直接拿过来的:
但字符串的内插就有所不同了。
Perl中可以这样实现字符串的变量替换:
而Ruby中是将变量用#{}包裹起来:
Perl的输入使用<STDIN>。不过,大家一般用钻石运算符(diamond operator)"<>":
在Ruby中,一般用STDIN.gets或者gets:
- 字符串
Perl的字符串可以用双引号括起来,也可以用qq//,qq||,qq{},qq后跟任意成对的符号.
Ruby也学来了,用%q或%Q加任意成对的符号.不过,Rubyist喜欢用%q[].(附带说明一下%q和%Q的区别,用%q来括就好象是用单引号,而%Q如同双引号.单双引号是不同的喔!)
- 数组
在Perl中,数组变量是以@符开头,用小括号把值括起来.
用qw也行:
Ruby中是用中括号,也可用%w。
Perl和Ruby的数组都可以自动扩充。数组中没有指定值的元素会被Perl设为undef,而Ruby中是nil。在Perl中计算数组长度是用$#array+1,其中$#array是数组array的最后一个索引值;而Ruby中就比较简单,可以用size或者length。
两者都有切片。
Ruby中还可以用Array.slice:
Perl用sort对数组排序。
($a和$b是Perl的预设常量,在排序时被用来作为两两取出的两个数字。Ruby中就不必这样,Ruby是用块中的变量来实现array.sort!{|a, b| a <=> b})
或者直接sort
Ruby还学来了join:
还有map:
Ruby中map <script src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" type="text/javascript"></script> <script src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" type="text/javascript"></script> 和collect同义:
以及grep:
当然Ruby中也有grep,不过在这里用select比较方便:
push/pop
shift/unshift
还有很多,都比较简单,这就不一一列举了。
- 基本控制结构
- 分支判断
- 循环
- Hash
- each
- keys和values
- exists
- delete
- 子程序
- 参数
- 返回值
- 正则表达式
- 文件操作
- 小结:
(待续,学习中……)
总的来说,Ruby像个OO版的Perl。Ruby的的确确从Perl那学来了不少东西,但把我们拉向Ruby阵营的还因为Ruby自身的特色(至于是什么,我还有梳理梳理^_^)。
参考书目: