From: Noritsugu Nakamura Date: 1997-11-26T22:38:29+09:00 Subject: [ruby-list:5446] [Summary 02/02] Re: ruby for perl users 中村です。 「Perl ユーザの素朴な疑問集」後編です。 === 制御構造 === = for ループはあるのでしょうか? Perl では、 for($i = 0; $i < 3; $i++) { } などとしていましたが、ruby では、 for i in 0..2 end とします。 = for($i = 0; $i < 3; $i += 0.5) {print "$i\n";} は どう書けば良いでしょうか? = foreach ループはあるのでしょうか? Perl では、 foreach (@array) { } などとしていましたが、ruby では、 array.each do |item| ... end や for item in array ... end とします。 array = ["a", "b", "c"] array.each do |item| print item, "\n" end for item in array print item, "\n" end = while(<>) { ... } という書式を良く使っていたのですが、 こういうのはどうやって書いたら良いでしょうか? while gets ... end となります。 = 連想配列のすべての key に対して処理を行うには どうやったら良いでしょうか? Perl では、 $hash = %hash = ('smtp' , '25', 'finger', '79'); foreach (keys %hash) { print "$_ $hash{$_}\n"; } などとしていましたが、ruby では、 hash = {"smtp" => 25, "finger" => 79} hash.each { |x, y| print x, " ", y, "\n"} などとします。(ウソかも) === クラス === = === 拡張モジュール === = 私も拡張モジュールを書いてみたいのですが、 簡単に書けるでしょうか? ruby の拡張モジュールは書きやすいと評判ですので、 C 言語が使える人はチャレンジしてみて下さい。 === エラー === = undefined local variable or method `hoge' for main(Object) とか怒られてしまったのですが、なぜでしょうか? rbc0> print bar ERR: undefined local variable or method `bar' for main(Object) ローカル変数は初期化をしてから使って下さい。 = str = '1'; str = a / 3; print str, "\n" を実行すると -:1: NameError: undefined method `/' for "1"(String) と怒られてしまいます。なぜでしょうか? rbc0> str = '1' "1" rbc0> str = str / 3 ERR: undefined method `/' for "1"(String) 文字列クラスの / というメソッドとしては 何も割り当てられていないからです。 Perl では数値と文字列が勝手に変換されるので 意識する必要がありませんが、ruby は勝手に 変換しません。気をつけましょう。 = ruby/tk を動かしたら lib/ruby/tkcore.rb:29:in `print': Errno::E000: Error 0 などと言われて終了してしまいました。なぜでしょうか? なぜ? (EWS4800 の特定の機種) === その他 === = 何かいろいろ変数の種類があるみたいで、 ややこしくありませんか? それは誤解です。ローカル変数、グローバル変数、 インスタンス変数、疑似変数、定数しかありません。 = local や my はありますか? Perl では何もしないとグローバル変数になってしまいますが、 ruby ではグローバル変数を使わない限りグローバルには ならないので、ありません。(というか必要ない、 Tcl ユーザの場合: global というのはありますか?) = パッケージはありますか? ある?ない?必要なし。 = セミコロンを行末につけても良いのでしょうか? つけても構いませんが…。 = end っていうのに慣れないのですが、どうしたら良いでしょうか? そのうち、すぐに慣れるでしょう。 = i++ とかいう表現は出来ないのでしょうか? 今のところできません。 = 三項演算子はありますか? if も値を持てるので if foo then bar else baz end と 書くことができます。 <-- ほげ? = サブルーチンと引数の扱いは、どうやったら良いのでしょうか? だいたい、 rbc0> def f(a, b=9) rbc1> a + b rbc1> end nil rbc0> f(1, 2) 3 rbc0> f(3) 12 みたいに使います。基本的には値渡しです。 ただ引数は呼び出し側と同じオブジェクトを参照しているので、 引数のオブジェクトの状態を変更するメソッドを呼び出した場合は、 呼び出し側のオブジェクトにも影響を与えます。 つまり、 def upcase1(str) return str.upcase # upcase はレシーバの状態を変更しない end def upcase2(str) return str.upcase! # upcase! はレシーバの状態を変更する end str = "abc" p upcase1(str) # "ABC" p str # "abc" p upcase2(str) # "ABC" p str # "ABC" となります。 = ファイルの扱いはどうやったら良いのでしょうか? だいたい, f = open(filename) while line = f.gets print line end f.close みたいに使います。ruby では例外処理機能が あるので、 f = open(filename) begin while line = f.gets print line end ensure f.close end のように例外処理をすることが多いです。 = 日本語はうまく扱えるのでしょうか? もちろん使えます。EUC を使っているかぎり 何も考えなくても大丈夫です。(正規表現でも?) 文字コードの変換には Kconv が利用できます。 require "kconv" str = "ほめぱげ" print Kconv::tosjis(str), "\n" = オブジェクト指向なぞというものを知らないのですが、 そんな私でも ruby を使うとうれしいことがありますか? ・オブジェクト指向しなくても使えます。 ・豊富な(今後どんどん増えるであろう)拡張モジュールが使えます。 ・ = Mule を使用しているのですか、ruby-mode というのはありますか? ソースファイルの sample に ruby-mode.el があります。 = デバッガありますか? あります。... = ruby で CGI 書けますか? もちろん書くことが出来ます。 ただし、まだプロバイダのところにインストールされて いないかもしれません (^^; 中村典嗣 E-mail: nnakamur@mxq.meshnet.or.jp