From: matz@... (Yukihiro Matsumoto) Date: 1996-01-24T17:17:41+09:00 Subject: [ruby-list:86] Re: ruby vs. perl まつもと ゆきひろ@トヨタケーラムです. In message "[ruby-list:85] Re: ruby vs. perl" on 96/01/24, P nakawtse 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は最初に配列を作っ ちゃいますから. まつもと ゆきひろ /:|)