中村です。
「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