[#5219] ruby for perl users — Noritsugu Nakamura <nnakamur@...>

35 messages 1997/11/09
[#5220] Re: ruby for perl users — tateishi@... (Tateishi Takaaki) 1997/11/09

立石です。

[#5224] Re: ruby for perl users — shugo@... (Shugo Maeda) 1997/11/09

前田です。

[#5243] read from subprocess — Kikutani Makoto <kikutani@...>

きくたにです。

17 messages 1997/11/10
[#5250] Re: read from subprocess — matz@... (Yukihiro Matsumoto) 1997/11/11

まつもと ゆきひろです

[#5300] Win32用の Rubyでの tkの使用 — Tomoaki Takebayashi <tota@...>

はじめまして、竹林といいます。

14 messages 1997/11/15
[#5302] Re: Win32用の Rubyでの tkの使用 — WATANABE Hirofumi <eban@...> 1997/11/15

わたなべです.

[#5303] Re: Win32 用の Rubyでの tkの使用 — Tomoaki Takebayashi <tota@...> 1997/11/15

[#5305] Re: Win32 用の Ruby での tk の使用 — aito@...5sun.yz.yamagata-u.ac.jp 1997/11/17

あ伊藤です.

[#5320] ruby 1.0-971118 released — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

20 messages 1997/11/18
[#5337] Re: ruby 1.0-971118 released — WATANABE Hirofumi <watanabe@...> 1997/11/19

わたなべです.

[#5340] Re: ruby 1.0-971118 released — matz@... (Yukihiro Matsumoto) 1997/11/19

まつもと ゆきひろです

[#5398] 配列への追加について — a-nisida@... (西田明良)

はじめまして、西田@初心者 と申します。m(..)m

16 messages 1997/11/22

[ruby-list:5446] [Summary 02/02] Re: ruby for perl users

From: Noritsugu Nakamura <nnakamur@...>
Date: 1997-11-26 13:38:29 UTC
List: ruby-list #5446
中村です。

「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

In This Thread