中村です。
「Perl ユーザの素朴な疑問集」を一応まとめてみました。
HTML 化していたのですが、なかなか作業が進まないので
とりあえずプレインテキストで。
皆様の答えをおおいに活用させていただきました。
改行が多いせいか、長くなってしまいましたので、
2 分割にします。
# japan.lang.ruby でなく japan.comp.lang.ruby でした。
=== 文字列 ===
= 文字列の連結はどうやれば良いのでしょうか?
Perl では、
$str = "foo" . "bar";
などとしていましたが、ruby では、
rbc0> str = "foo" + "bar"
"foobar"
とします。これは文字列型(クラス)の + という
メソッドに連結が割り当てられているからです。
= 文字列の繰り返しはどうやれば良いのでしょうか?
Perl では、
$str = "foo" x 5;
などとしていましたが、ruby では、
rbc0> str = "foo" * 5
"foofoofoofoofoo"
とします。
= 文字列の展開がされないようですが、どうしてですか?
Perl では、
$name = "Nakamura";
print "I am $name.\n";
などとしていましたが、ruby では、
name = "Nakamura"
print "I am #{name}.\n"
のように${と}でかこってください。
グローバル変数($nameとか)やインスタンス変数(@nameなど)の場合は、
print "I am #$name.\n"
のように{と}を省略することができます。
= 部分文字列を切り出したいのですが、どうやれば良いのでしょうか?
Perl では substr を使いますが、ruby では、
self[offset, length]
で部分文字列を取り出すことができます。
self[firstIndex...lastIndex]
でも OK です。
rbc0> str = "0123456789"
0123456789
rbc0> str[2,3]
234
rbc0> str[2..4]
234
= 文字列比較の eq, ne とか、あるのでしょうか?
文字列の比較も数値同様 == でOKです。
rbc0> str1 = "abc"
abc
rbc0> str2 = "abc"
abc
rbc0> str1 == str2
TRUE
ruby では == は同値を意味します。
オブジェクトの同一性を調べたい場合は equal? を使って
ください。また、lt gt le ge <=> に相当するものとして
それぞれ < > <= >= <=> があります。
ただし、ruby では Perl のように数値と文字列が勝手に
変換されることはないので、1 == "1" は Perl では 1(真)、
ruby では FALSE になります(print では to_s が暗黙の
うちに呼ばれますが、これは例外です)
= chop, chomp はあるのでしょうか?
chop は str.chop で OK です。
rbc0> "abc".chop
ab
chomp は、Version 1.1 からは使うことが出来ます。
= 置換はどうやったら良いのでしょうか?
Perl の s///; や s///g; や tr///; に相当するものとして、
文字列クラスに sub, gsub, tr などのメソッドがあります。
rbc0> "abcabc".sub("a", "d")
"dbcabc"
rbc0> "abcabc".gsub("a", "d")
"dbcdbc"
rbc0> "abcabc".tr("abc", "ABC")
"ABCABC"
! がついていると文字列の中身を書き換えます。
rbc0> str = "abcabc"
"abcabc"
rbc0> str.sub("a", "d")
"dbcabc"
rbc0> str
"abcabc"
rbc0> str.sub!("a", "d")
"dbcabc"
rbc0> str
"dbcabc"
= Perl の ord はあるのでしょうか?
str.unpack("C") で OK です。でも、str[0] の方が簡単です。
rbc0> "A".unpack("C")
[65]
rbc0> "A"[0]
65
ちなみに str = "A" のとき str[0] は 65(Fixnum) になりますが、
str[0, 1] は "A"(String) になります。
= pack("C", char) はどう書けば良いのでしょうか?
[char].pack("C") で OK です。でも、char.chr の方が簡単です。
C 言語に慣れてる人の場合は sprintf "%c", char の方が
しっくりくるでしょうか。
rbc0> char = 65
65
rbc0> [char].pack("C")
"A"
rbc0> char.chr
"A"
rbc0> sprintf "%c", char
"A"
=== 配列 ===
= 配列の初期化とアクセスはどうやれば良いのでしょうか?
rbc0> array = ["a", "b", "c"]
["a", "b", "c"]
rbc0> array[0]
"a"
rbc0> array[0] = "A"
"A"
rbc0> array[0]
"A"
= 配列の連結はどうやれば良いのでしょうか?
+ を使います。これは配列クラスの + という
メソッドに連結が割り当てられているからです。
rbc0> ["a", "b", "c"] + ["d", "e", "f"]
["a", "b", "c", "d", "e", "f"]
= 配列の要素数はどうやったら知ることが出来ますか?
Perl では $#array や @array などでしたが、
ruby では配列クラスに length もしくは size という
メソッドがあります。
rbc0> array = ["a", "b", "c"]
["a", "b", "c"]
rbc0> array.length
3
rbc0> array.size
3
= 空リストはどう書けば良いのでしょうか?
Perl では () でしたが、
ruby では [] で表します。
= 多次元配列を扱うことは出来ますか?
できます。
=== 連想配列 ===
= 連想配列の初期化はどうやれば良いのでしょうか?
Perl では
%hash = ('smtp' , '25', 'finger', '79');
などとしていましたが、ruby では、
rbc0> hash = {"smtp" => 25, "finger" => 79}
{"smtp"=>25, "finger"=>79}
とします。ちなみに Perl では、
%hash = (smtp , 25, finger , 79);
と書けますが、ruby では
hash = {smtp => 25, finger => 79}
とすることはできません。(できるけど違う意味です)
= 連想配列のアクセスはどうやれば良いのでしょうか?
rbc0> hash["ftp"] = 21
21
rbc0> hash["ftp"]
21
とします。