前田です。 In message "[ruby-list:5220] Re: ruby for perl users" Tateishi Takaaki <tateishi / sy.is.noda.sut.ac.jp> wrote: |>> 問題かも知れませんが、多分こういうのをすぐに疑問に |>> 感じると思うので…。 | |でもやっぱりマニュアルにすべて載ってた |ように思います。 | |それを見ないでプログラムを組もうとする |プログラマ(より一般的な意味で)はいない |と思うのですが、、、、、 それはそうなのですが,Perlから以降する人のためのFAQが あればruby普及に役立つかも,と思ったりもしますね(^^; Perl使いでないので間違えてるかもしれませんが,一応 回答を試んでみます。 In message "[ruby-list:5219] ruby for perl users" Noritsugu Nakamura <nnakamur / mxq.meshnet.or.jp> wrote: |◎ Perl だと |$name = "Nakamura"; |print "I am $name\n"; |とか書いてましたが、 |ruby ではどう書くのですか? |print "I am $name\n"; |と書いてもうまくいきませんが。 print "I am #{$name}\n" のように${と}で括ってください。 グローバル変数($nameとか)やインスタンス変数(@nameなど)の 場合は, print "I am #$name\n" のように{と}を省略できます。 |◎ 文字列の連結 |$hoge = "foo" . "bar"; |ってやっていましたが、ruby ではどう書くの? rubyの場合はオブジェクトが自分のデータ型(つまりクラス)を 知っているので,数値でも文字列でも+で適切な動作をします。 rbc0> 1 + 2 3 rbc0> "1" + "2" "12" |◎ 部分文字列を切り出したいのですが、substr は? self[offset, length] で部分文字列を取り出すことができます。 rbc0> "0123456"[2, 3] "234" self[firstIndex...lastIndex] でもOKです。 rbc0> "0123456"[2..4] "234" |◎ chop, chomp はありますか? rbc0> "abc".chop "ab" でOKです。 # chompって? |◎ 文字列比較 eq, ne とかありますか? 文字列の比較も数値同様==でOKです。 rbc0> str1 = "abc" "abc" rbc0> str2 = "abc" "abc" rbc0> str1 == str2 true rubyでは==は同値を意味します。 オブジェクトの同一性を調べたい場合はequal?を使って ください。 |◎ 配列の初期化とアクセスはどうやったら? rbc0> array = ["a", "b", "c"] ["a", "b", "c"] rbc0> array[0] "a" rbc0> array[0] = "A" "A" rbc0> array[0] |◎ 連想配列の初期化は? |%hogehoge = ('smtp' , '25', 'finger', '79'); |のような…。 rbc0> hash = {"smtp"=>25, "finger"=>79} {"smtp"=>25, "finger"=>79} とします。 |◎ 連想配列のアクセスは? rbc0> hash["ftp"] = 21 21 rbc0> hash["ftp"] 21 とします。 |◎ for($i = 0; $i < 3; $i++) { } |とかはどう書けば良いの? for i in 0..3 end を使います。 配列のアクセスなどは array.each do |item| ... end や for item in array ... end を使った方が便利です。 |◎ foreach は使えるの? eachやforを使ってください。 |◎ while(<>) { } |とか良く使っていたのですが、 |これはどう書いたら良いの? while(<>) {} の意味がわかんなかったりして(^^; |◎ 置換したいのですが、s///; tr///; に |相当するものはありますか? Stringにsub,gsub,trなどのメソッドがあります。 |◎ 日本語は使えるの? もちろん:-) EUCを使っているかぎり何も考えなくても大丈夫です。 文字コードの変換にはKconvが利用できます。 |◎ サブルーチンと引数の扱い方は? 基本的には値渡しです。 ただ引数は呼び出し側と同じオブジェクトを参照しているので, 引数のオブジェクトの状態を変更するメソッドを呼び出した場合 は,呼び出し側のオブジェクトにも影響を与えます。 つまり 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 みたいな感じです。 f = open(filename) begin while line = f.gets print line end ensure f.close end のように例外処理をすることが多いです。 -- 前田 修吾