Ruby Cadet Club #5

Original doc. 1999-02-23, by guel

Ruby 最初の一歩

プログラム言語の最初のサンプルといえば,K&R 以来 Hello World と相場が
決まっているようです。
しかしスクリプト言語の場合はこの例はちょっと困りものです。
だって,print "Hello World\n" となる。。
といったところで,何の新しい情報が得られるワケではありませんから。

スクリプト言語の最初の例に相応しいのは,cat だと思います。
入力から読み込んだテキストを何も操作せず,そのまま出力にだす。

では,ruby での cat サンプルを作ってみませう。


#-------------------------------------- cat1.rb ^
file = open(ARGV[0], "r")

while oneline = file.gets
	print oneline
end

file.close
#-------------------------------------- cat1.rb $

まず,ファイルオープンしています。
ARGV はコマンドラインの引数で配列です。"r"は read only モード。
open() はファイルハンドルを返す,と言いたいところですが,実はこの
返されたものは,FILE オブジェクトです。
オブジェクトなので自身,メソッドを持っています。
gets は,そのメソッドの一つでファイルから1行読み込むものです。

あと,while..end は繰り返しです。ruby は,C のようにブロックを {}
で表現しません。algol の流れをくんで end で構文が終わります。
pascal とは,begin が無いことが違いますね。
print は出力,close はファイルクローズです。
なお,print も関数ではなく,基底クラスのメソッドだそうです。
ま,普通に使うには関数のように使えています。


さて,この例では1行ずつ読み込んでいますが,これは非効率ですね。
Perl では,メモリがふんだんに使える環境では,ファイルまるごとメモリに
飲み込んでしまういうアバウトなことがよくやられます。

ruby でもこれは可能です。
次の例はこの方法です。


#-------------------------------------- cat2.rb ^
file = open(ARGV[0], "r")

lines = file.readlines
print lines

file.close
#-------------------------------------- cat2.rb $

readline というメソッドはファイル内容を全部読み込みます。
つまり lines は,配列変数ですね。
ruby は Perl と違ってスカラー変数,配列変数と接頭辞($,@)を付けて区別
するような欝陶しいことはしません。

さて,実は上の例では変数 lines は不要で,


#-------------------------------------- cat3.rb ^
file = open(ARGV[0], "r")

print file.readlines

file.close
#-------------------------------------- cat3.rb $

このように書けます。
わずか3行になってしまいましたね。

さらに,コマンドライン引数からファイル名を得るのではなく,標準入力
から得るとすると次のようになります。


#-------------------------------------- cat4.rb ^
print readlines
#-------------------------------------- cat4.rb $

あれま,とうとう1行になってしまいました。:-)
標準入力が相手の時は,AWK のように暗黙にオープンしますので,コード上で
open() を書くのは不要になります。


> ruby cat4.rb matusima.txt

このように使います。

次にコマンドラインでファイル名を指定する方法に戻って,ファイル名が複数
「だぁー」とある場合を想定すると,こうなります。


#-------------------------------------- cat5.rb ^
for fname in ARGV
	file = open(fname, "r")
	print file.readlines
	file.close
end
#-------------------------------------- cat5.rb $

cat3.rb からの変形です。
繰り返し構文の for .. in .. DO .. end を使います。

for in で配列(この場合はコマンドライン引数群)内容を次々操作できます。

繰り返しについては,for のようなできあいのものだけではなく,ユーザ定義の
いろんな繰り返しパターンが利用できるイテレータという ruby ならではのもの
があり,とても便利だそうですよ。


Count ->

update 2000-07-15, since 2000-07-15
Copyright (c) 2000
by guel. All rights reserved.