【コラム】
第11回は、オブジェクト指向のスクリプト言語のRubyです。RubyのHello Worldは、リスト1のようにputsを使います。putsは、文字列の終端に改行コードが付いていなければ自動的に改行を付加してくれます(すでに改行が付いていれば付加しません)。また、RubyはPerlなどとは違って、各行末にセミコロンを付ける必要がありません。
#!/usr/bin/ruby ← Rubyスクリプトであることを指定
puts 'Hello World' ← putsを使ってメッセージ出力(改行コードは不要)
Rubyスクリプトは、ほかのスクリプト同様、chmodコマンドで実行属性を付ければ実行できます(実行例1)。なお、Rubyスクリプトに拡張子を付ける場合は.rbとしますが、 本稿では拡張子を付けていません。
$ chmod +x ruby_puts ← Rubyスクリプトに実行属性を付ける
$ ./ruby_puts ← Rubyスクリプトを実行
Hello World ← 確かにHello Worldが表示される
$ ← シェルのプロンプトに戻る
Perlと同様に、printやprintfを使うこともできます(リスト2、リスト3)。改行コードなどのエスケープ文字が含まれる文字列は、ダブルクォートを使う必要があります。
#!/usr/bin/ruby
print "Hello World\n" ← printを使ってメッセージ出力(改行コードが必要)
#!/usr/bin/ruby
printf "%s\n", 'Hello World' ← printfを使って文字列を出力
標準出力に対して、そのwriteメソッドを使って文字列を出力することもできます(リスト4)。
#!/usr/bin/ruby
STDOUT.write "Hello World\n" ← 標準出力のwriteメソッドを実行
Rubyのプログラムをコマンドラインの引数にして直接実行するには、Perlと同様に-eオプションを使います(実行例2)。
$ ruby -e 'puts "Hello World"'
Hello World ← 確かにHello Worldが表示される
OSのコマンドを呼び出すsystemを利用することもできます(リスト5)。
#!/usr/bin/ruby
system 'echo "Hello World"' ← systemで、OS上のechoコマンドを実行
OSのコマンドをRubyプログラムの最後から呼び出す場合は、systemの代わりにexecを使えば、同じプロセスIDのまま実行され、プロセスの節約になります(リスト6)。
#!/usr/bin/ruby
exec 'echo "Hello World"' ← OS上のechoコマンドをexecする
Rubyスクリプトの後ろに文字列を直接記述し、それをRubyスクリプト自身で読み出すという方法も考えられます(リスト7)。ここでは、「__DATA__」という文字列を目印にして、その位置までファイルを読み飛ばし、その次の1行をそのまま出力しています。「gets("\n__DATA__\n")」自身が目印と誤認されないように、__DATA__の前後に"\n"を付けている点にも注意してください。
#!/usr/bin/ruby
file = open($0) ← スクリプトファイル自身をオープン
file.gets("\n__DATA__\n") ← __DATA__の位置まで読み飛ばす
puts file.gets() ← その直後の1行を読み込んで表示
exit ← __DATA__の部分よりも前でRubyを終了
__DATA__ ← データの開始を示す目印
Hello World ← 文字列を直接記述
スクリプトの1行目の「#!」の行に直接Rubyのコマンドを記述する方式で、変則的なRubyスクリプトを作ることができます。この行はカーネルによって直接解釈されるため、Rubyの引数部分にはスペースを入れないようにします。
リスト8は、1行コマンドをスクリプトにしたものです。スペースは\x20で表現します。
#!/usr/bin/ruby -eputs"Hello\x20World" ← 1行だけのRubyスクリプト
リスト9は、3行目だけを抜き出すプログラムを記述し、スクリプトの3行目に文字列を直接記述したものです。Rubyに-nオプションを付加し、whileループの記述を省略しています。
#!/usr/bin/ruby -neif($.==3);print;end ← 3行目を抜き出すRubyプログラム
Hello World ← 3行目にメッセージを直接記述
リスト10は、同じ発想で、正規表現を使って行を抜き出すようにしたものです。Rubyには-nオプションとともに-lオプションも付加し、各行を自動的に「chop!」しています。
#!/usr/bin/ruby -nleif(/^[^#]/);print;end ← 正規表現でメッセージを抜き出す
← ここは空行
Hello World ← メッセージを直接記述
Rubyには、GUIのライブラリも存在します。Ruby/Tkを使ったTck/Tkベースのプログラムはリスト11のとおりです。実行すると図1のウィンドウが立ち上がります。なお、以降のGUIのプログラムには終了ボタンがありませんので、ウィンドウマネージャのメニューなどで終了させてください。
#!/usr/bin/ruby
require 'tk' ← tkライブラリをロード
label = TkLabel.new( ← ラベルを作成
'text' => 'Hello World', ← 表示する文字列
'width' => 22, ← 横幅を指定
'height' => 5 ← 高さを指定
)
label.pack ← ラベルを配置する
Tk.mainloop ← メインループを実行
|
|
図1 Ruby/TkのHello World |
Ruby/GTK2を使う場合はリスト12、図2のようになります。
#!/usr/bin/ruby
require 'gtk2' ← gtk2ライブラリをロード
window = Gtk::Window.new ← トップレベルウィンドウを作成
window.signal_connect('destroy'){Gtk.main_quit} ← destroyに対するハンドラ
label = Gtk::Label.new('Hello World') ← 文字列を指定してラベルを作成
label.set_size_request(160, 80) ← ラベルのサイズを指定
window.add(label) ← ウィンドウにラベルを張り付ける
window.show_all ← すべてを可視状態にする
Gtk.main ← メインループを実行
|
|
図2 Ruby/GTK2のHello World |
| 理研、脳・脊髄形成に必要な神経板湾曲の仕組みを解明 [20:16 5/25] |
| 京大、「慢性閉塞性肺疾患」患者の労作時呼吸困難は鍼治療が有効と実証 [20:08 5/25] |
| 120Hz SHVカメラ用イメージセンサーを使った撮像装置 - SHVフルスペック化へ [18:10 5/25] |
| 京大、視覚による物体認知は前頭前野からのトップダウン信号が重要と確認 [17:45 5/25] |
| 製品数の拡大だけでなくBCPの展開なども含めた総合力で事業の強化を図るTI [17:25 5/25] |
|
【連載】これだけは要チェック! TOEIC(R)単語帳 第108回 今回のお題は…「issue」 [20:00 5/27] キャリア |
|
TVアニメ『ペルソナ4』、新規カットを加えた再編集版を劇場でイベント上映 [20:00 5/27] ホビー |
|
[9nine]制服姿見納め? セーラー服で登場も川島海荷「4人はコスプレ」 [19:15 5/27] エンタメ |
|
「NO.6」4巻は書き下ろしドラマCD付、木乃のサイン会も [18:49 5/27] ホビー |
|
[今週の新刊]マンガ大賞3回ノミネート「アイアムアヒーロー」 カープ愛「球場ラヴァーズ」も [18:33 5/27] ホビー |
4つの診断で、自分の適性を見つめなおそう!
働くこと・挑戦し続けることへの思いを綴ったインタビュー
あなたにピッタリのアドバイスを読むことができます。
転職に必要な情報が収集できます
企業からアプローチのメッセージが届きます。