[ruby-list:86] Re: ruby vs. perl

From: matz@... (Yukihiro Matsumoto)
Date: 1996-01-24 08:17:41 UTC
List: ruby-list #86
まつもと ゆきひろ@トヨタケーラムです.

In message "[ruby-list:85] Re: ruby vs. perl"
    on 96/01/24, P nakawtse <nakawtse@syrinx.dq.isl.ntt.jp> writes:

|> まあ,perlは決して分かりやすい言語ではありませんから,そうい
|> う意味でのalternativeは意味があると思います.私みたいにperl
|> の嫌いな人もいるでしょうし.
|
|   perlが嫌いだったんですか???.

便利だなと思うんですけど,時々怒りを覚えるんですよね.
# ど〜してなんだよ〜っつうか

もし,perlを愛していたらrubyは作らなかったでしょうね.

|> rubyにも$_はあるんです.でも,rubyの$_はgetsの最後の戻り値と
|> いう意味しかないので,ちょっとperlとは違うなあ.基本的な思想
|> が違うんで真似してもしょうがない部分もあるんですけど.
|
|  perlと同じ特殊変数は同じものだと思ってしまうのですが
| 違うところはどこなのでしょう?

確かに同じ名前で違う働きをすると混乱のもとですね(でもperlに
いわれたくないなあ).そのうち『perl使いの気をつけるべきこと』
というperlのmanにあるみたいなものをつけないといけないかなあ.

ちなみに相違点は以下の通りです.

同じところ

  (1) gets(perlなら<>)の最後の値が格納される
  (2) 正規表現のマッチのデフォルト(`if /abc/'とか)

違うところ

  (a) gets以外は`$_'の値を変えない
  (b) よってforのデフォルトの変数ではない
  (c) ほとんどの関数は`$_'をデフォルト値にしない.例外は
      sub/gsub/chopくらいか.

| #思想まで違うとは..

「ruby vs perl」のメイルでも書いたように,rubyはperlに似た機
能を違う思想(オブジェクト指向,lisp的?など)で設計した言語で
す.思想が違うのはむしろ当然ですね.なかにはperl大好きの人に
は不便に思えるものもあるかも知れません.

|> getsはfile{1,2,3..}からなる仮想ファイルから1行ずつ読み込ん
|> で来る関数です.
|
|     file{1,2,3..}  -> file1 file2 file3 
|   こんな展開?..
|     file[1..3]とはまた違うのでしょうか?

ああ,これはrubyの記法ではなく,cshの記法のつもりでした.つ
まり「getsというのは,引数として与えられたファイル名で指定さ
れるファイルを繋げた仮想的なファイルから1行読み込む関数です」
という意味です.

# ちょっと省略しすぎですね.

| each(%assoc)では途中でリセットできないのでいやなのですが,
| rubyでは何とかなる? 

途中でリセットできないというとeachの状態を戻せないということ
でしょうか.rubyならできます.

 for k,v in assoc
   処理
   retry if 条件
 end

で条件が成立する時,ループ全体を最初からやりなおせます.

|それからこんな記法(perl でいえば)とか↓
|
|   @assoc{/xyz./} <−マッチするキーに対する値のリスト.
|    #↓より効率よく処理していて欲しい.
|  while( ($k,$v)=each %assoc){
|      push(@lst,$v) if /xyz./;
|    }

うーん,いくらrubyがどんどんクラスを追加することを推奨してい
るからといっても,「そういうクラスを書けばできます」というの
は反則でしょうねえ.

もし,あえて標準ライブラリの範囲内で記述するならば,

 assoc.find_all{|k,v| v =~ /xyz./}

でしょうか.上のperlの例よりはちょっとましくらいの効率ですが.

perlの

 grep(/xyz./, values %assoc)

を連想させますが,効率は全然違います.perlは最初に配列を作っ
ちゃいますから.
                                まつもと ゆきひろ /:|)

In This Thread

Prev Next