文房具としてのRubyのススメ
パソコンを自分の手足のように使うための道具としてRubyを覚えてみましょう.普段何気なく繰り返していた不毛な処理が一気に解決できるかもしれません.
なんどもいいますが,Rubyプログラムを書いていて何か間違えても,普通はシステムを壊すことはありません.
高機能電卓として
計算するとき,まだ電卓を起動してませんか?
irb
% irb irb(main):001:0> 3+4
変数を定義してみよう
電卓にだってメモリ機能がありますよね.変数を使うと計算の過程に自由に名前をつけられます.まずは,変数名はアルファベットの小文字か_か数字(先頭以外)にしておきましょう.
irb(main):001:0> a = 10 => 10 irb(main):002:0> a => 10 irb(main):003:0> a + 20 => 30 irb(main):004:0>
関数を作ってみよう
計算の過程だけじゃなくて,「どんな計算をするか」にだって名前がつけられます.
irb(main):001:0> def test irb(main):002:1> return 10 irb(main):003:1> end => nil irb(main):004:0> test => 10
irb(main):006:0> def add(a, b) irb(main):007:1> a + b irb(main):008:1> end => nil irb(main):009:0> add ArgumentError: wrong number of arguments (0 for 2) from (irb):9:in `add' from (irb):9 from :0 irb(main):010:0> add(10, 20) => 30
スクリプトとして
irbで毎回関数や式を入力するのではなく,あらかじめファイルに保存しておいて実行することができます.
ファイルの拡張子は".rb"にしておこう
% emacs hoge.rb
または,
% vi hoge.rb
でファイルを開いて,適当にスクリプトを書いたら保存.
% ruby hoge.rb
でファイルの内容をRubyが読んで実行してくれる.
スクリプトで出力するときはputsを使おう (test01.rb)
文字列は"Hello World"のように"(ダブルクォーテーション)で囲む
puts "Hello World"
%"
困ったらpで出力 (test02.rb)
rubyが,それっぽく表示してくれる
p "Hello World" p 3
条件分岐を書いてみよう (test03.rb)
if 100 > 10 then puts "It is true that 100 is bigger than 10." else puts "Your computer is broken." end
繰り返しの処理を書いてみよう (test04.rb)
文字列の中に#{}という記号で変数を囲むと,変数の値を文字列として展開してくれます
100.times{|n| puts "Hello #{n}" }
ファイルに出力するときはとりあえずリダイレクトが便利
ruby test04.rb > test04.dat
で,test04.datに結果が保存される.
cat test04.dat
として確認してみよう.
FizzBuzz
1から100までの数で3の倍数のときには"Fizz",5の倍数のときには"Buzz",それ以外のときはその数字を出力するスクリプトを書いてみよう
キーボード入力を受けとってみよう
一行入力してもらう (test05.rb)
l = gets puts "Hello #{l}"
飽きるまで入力してもらうとき (test06.rb)
whileでは,条件式が真の間,ずっとその中身が実行されます
while (l = gets) != nil puts "Hello #{l}" end
この場合の条件式は,(l = gets) != nilだね.
飽きたらC-dを入力しよう.
〜じゃない間はuntil (test07.rb)
until (l = gets) == nil puts "Hello #{l}" end
リダイレクトでファイルから入力を受けてみよう
% ruby test07.rb < test04.dat
文字列処理してみよう
文字も==で比較しよう (test08.rb)
実は最後に改行があることに注意しよう!!
until (l = gets) == nil if l == "Hello 94\n" then puts "Find \"Hello 94!!\"" end
end
文字列として"を出力したい場合には\"としようね.
%"
文字を分割してみよう (test09.rb)
空白で分割する場合
until (l = gets) == nil puts l.split(" ") end
正規表現 (test10.rb)
正規表現で,好きな文字集合を取り出すことができる
until (l = gets) == nil if /(\d+)/ =~ l then puts $1 end end
文字と数字の変換 (test11.rb)
文字は数字に変換できるよ
sum = 0 until (l = gets) == nil if /(\d+)/ =~ l then sum = sum + $1.to_i end end p sum
FizzBuzz
ファイルから読み込んだ1から100までの数が3の倍数のときには"Fizz",5の倍数のときには"Buzz"と表示してみよう
Unixコマンドを呼び出してみよう
systemコマンド (test12.rb)
system("ls")
たとえば連番のファイルを作りたいとき
100.times{|n| system "touch file#{n}" }
しつこくFizzBuzz
1から100までの数で3の倍数のときには"Fizz",5の倍数のときには"Buzz",それ以外のときはその数字のファイルを作ってみよう