Chinaunix

标题: [讨论] Perl 和 Ruby 的不同 [打印本页]

作者: Perlvim    时间: 2013-04-10 16:23
标题: [讨论] Perl 和 Ruby 的不同
以下内容摘自 Ruby 官方主页的繁体中文版本,作了简单的处理,有不通顺的地方,请参看英文:

http://www.ruby-lang.org/en/docu ... /to-ruby-from-perl/

大家可以发表自己的看法。

从 Perl 到 Ruby
Perl 很赞,Perl 的文件也很赞,Perl 的社群就是...很赞。但是,这程式语言也相当庞大甚至可说是复杂。对那些渴望拥有一个纯真、更多直觉,天生就内建变量导向特性语言的骆驼客来说,Ruby 也许就是为你设计的。

相似点

如同 Perl 一般,在 Ruby 中,

你已经拥有一套套件管理系统,有点像是 CPAN(虽然它叫做 RubyGems)。
正则表达式直接内建,胃口够大吧!
有相当多常用的一般性内建套件。
括号总是可省略的。
字串操作方式基本上是一样的。
有一种以常见分隔符号表示的字串,和一种类似 Perl 般以正则表达式语法表示的字串(看起来像是 %q{这种(单引号)表示法},或 %Q{这种(双引号)表示法},以及 %w{这种 表示 一组 单引号 字串 的 阵列}。如果你喜欢的话,你也 %Q|能| %Q(用) %Q^其他种类^ 的分隔符号)。
你会有双引号表示法可以做字串内的变量取代,虽然它 "看起来#{like}这样"(而且能放任何你喜欢的 Ruby 语法在这里面 #{})。
命令列指令的展开执行使用 `反引号`。
也有内嵌的文件工具(Ruby 的叫做 rdoc)。
相异点

不同于 Perl 的是,在 Ruby 中,

你没有与 Perl 一样的上下文依赖(context-dependent)规则。
一个变量并不等同于一个它所代表的变量。而只是一个变量的参考。
虽然 $ 和 @ 有可以当做变量名称的第一个字符,但不是指变量的类型,而是表示变量的作用域(scope)($ 代表全域变量,@ 代表实例变量,@@ 则是类别变量)。
阵列符号使用的是中括号([])而不是小括号(())。
在其他列表中建立列表(list)并不会使它们变成一份大列表,相反地你得到的是阵列中的阵列。
应该使用 def 而不是 sub 来表示函式。
并没有在每行结尾加上分号的需求。值得一提的是,你需要用 end 这种关键字来结束函式的定义、类别定义和 case 条件式。
变量是强类型。如果你需要转换成不同类型,你将需要手动调用 foo.to_i、foo.to_s 等等。
没有 eq、ne、lt、gt、ge 或 le 这种写法。
没有钻石型操作符(<>)。你反而较常使用 IO.some_func。
胖逗号(=>)只用来做为散列键值对连接符号。
没有 undef 的写法,在 Ruby 中你必须写 nil。nil 是个变量(在 Ruby 中所有东西都是变量),它比较不像是个未定义的变量。如果你把它拿来当做布尔值(boolean)使用,它会被评估为 false。
当测试真值(true)时,只有 false 和 nil 会被评估为假值(false),其他任何值都会被当做真值(包括 0、0.0 和 "0")。
这里没有 PerlMonks 。但 ruby-talk 邮件论坛是个非常有帮助的地方。

作者: 兰花仙子    时间: 2013-04-10 22:42
这个对比太表面了。最主要区别在于OO吧。另外ruby借鉴了函数式编程的一些思想。
作者: rubyish    时间: 2013-04-11 07:55
很赞。
作者: Perlvim    时间: 2013-04-11 08:15
Ruby 的语言架构在 OO 之上。确实是 Perl 没有的。

Ruby 虽然设计精致,但几个地方发现很变扭:

1. 代码块,用 |var| 的语法设置代码块变量,但却不知道和迭代器内置的变量是否冲突,就小心的用单字符变量来设置。这就是语言设计的问题。应当将代码块内的变量和迭代器内的变量采用一种隔离机制。

2. 模块和类的区别,类有模块的功能,但还是加上了模块,只为实现多重继承。应当在类中添加关键字来实现。

3. 针对类设计的实例变量和类变量等标识符的写法,不能扩展到普通方法中进行使用。使语言的一致性降低。
作者: rubyish    时间: 2013-04-11 08:18
确实是。
作者: zhlong8    时间: 2013-04-11 09:06
肯定是OO啊,Ruby 利用自己纯OO和默认 self 玩出各花样,相较之下 Perl 的 $_  也没那么炫了
作者: shijiang1130    时间: 2013-04-11 09:30
我比较看重它们之间库的没有重叠的地方,有的cpan没有,在gem里可以找到。
作者: shijiang1130    时间: 2013-04-11 09:58
还想起一个。Perl好像没有内置交互式,你Ruby是有的irb,这个很方便的
作者: Perlvim    时间: 2013-04-11 10:07
回复 8# shijiang1130

Python Haskell 等许多语言都有,这些东西让语言可以用一种更简洁的方式展示自己的功能。我儿子现在非常喜欢 Ruby 的 irb ,每天都用他来考计算机加法。
   
其实 Perl 也有,不过是个人搞的,很简陋。
作者: kk861123    时间: 2013-04-11 11:00
回复 9# Perlvim


    老哥,你儿子多大了?
作者: shijiang1130    时间: 2013-04-11 11:08
那有个相片,你猜下多大了
作者: Perlvim    时间: 2013-04-11 11:34
回复 10# kk861123

6岁了。
   
作者: 2gua    时间: 2013-04-11 14:34
Ruby和Perl有啥好比的?我觉得要比就是生搬硬套、鸡鸭混讲。
作者: Perlvim    时间: 2013-04-11 15:25
鸡鸭虽是不同种类,发生禽流感,鸡鸭一起干掉。:wink:

很多领域, Ruby 和 Perl 做一样的事情。对于想学习 Ruby 的 Perler, 提前了解一些区别,有助于尽快掌握,少犯错误。
作者: 兰花仙子    时间: 2013-04-11 20:55
shijiang1130 发表于 2013-04-11 09:30
我比较看重它们之间库的没有重叠的地方,有的cpan没有,在gem里可以找到。


perl的MQ库很烂,ruby的就强多了。
rubyamqp.info
rubybunny.info
一个异步 一个同步
作者: shijiang1130    时间: 2013-04-12 08:58
回复 15# 兰花仙子
我是有感于Net SSH库而发的,在ruby里有个Net-SSH-GateWay,Perl没得

   
作者: yoruichi924    时间: 2014-08-16 23:37
初学者飘过!
perl学的也是半吊子,现在又来学习ruby!
LZ总结的有些看不懂,不明觉厉




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2