從 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_ifoo.to_s 等等。
  • 沒有 eqneltgtgele 這種寫法。
  • 沒有鑽石型操作符(<>)。你反而較常使用 IO.some_method
  • 胖逗號(=>)只用來做為雜湊符號。
  • 沒有 undef 的寫法,在 Ruby 中你必須寫 nilnil 是個物件(在 Ruby 中所有東西都是物件),它比較不像是個未定義的變數。如果你把它拿來當做布林值(boolean)使用,它會被評估為 false
  • 當測試真值(true)時,只有 falsenil 會被評估為假值(false),其他任何值都會被當做真值(包括 00.0"0")。
  • 這裡沒有 PerlMonks 。但 ruby-talk 郵件論壇是個非常有幫助的地方。