RubyのFile/IOクラスで入力と出力、ファイルの読み取りと書き込み、フィルター作成:若手エンジニア/初心者のためのRuby 2.1入門(10)(1/2 ページ)
オープンソースのオブジェクト指向プログラミング言語「Ruby」の文法を一から学ぶための入門連載。最新版の2.1に対応しています。今回は、Kernelモジュールに定義されている主な入出力メソッドとしてprint、puts、printf、gets、File/IOクラス、STDOUT、STDINの使い方、フィルターの作り方などを解説。
何気なく使ってきた「puts」も標準出力にデータを流すメソッド
前回の「Rubyの例外とその捕捉――基本のbegin〜rescue〜endからensure、else、retry、後置rescueまで」では、オブジェクト指向言語ではポピュラーな仕組みである、例外とその捕捉といったトピックについて解説しました。例外をうまく扱うことで、ファイルが存在しない場合や、HTTP通信でデータを取得できない場合などに適切に対処できるプログラムを書くことができます。
連載第10回に当たる今回は、データの入出力について解説します。Rubyでは入出力、いわゆるI/Oをシンプルに扱うことができます。何気なく使ってきた「puts」も標準出力にデータを流すための立派なメソッドですし、IOクラスを利用することで、ファイルの入出力も可能です。
UNIX系OSにおける入出力
これまでの連載で「puts」メソッドを利用してターミナルに文字列を表示し、「画面に文字を表示する」と表現してきました。これは、「標準出力に文字列を出力する」と言った方が正しいでしょう。
特に意識せずにRubyスクリプトを流せば、標準出力に出力された文字はターミナルに表示されます。ただし、bashやそれに準ずるシェルを使っているならば、以下のようにRubyスクリプトを実行すると、標準出力がファイルに書き出されます。
$ ruby -e "puts 'pyon'" > rabbit.txt $ cat rabbit.txt
rubyコマンドに「-e」というオプションと文字列(ここでは「puts 'pyon'」)を与えると、文字列がRubyインタプリタによってスクリプトとして実行されます。また、「> rabbit.txt」は、標準出力に出力された文字をファイル(ここではrabbit.txt)に送るための記法です。
上述の一連のコマンドを実行すると、「puts」を実行しているにもかかわらず、ターミナルには何も表示されません。その代わりに、「cat」コマンドでrabbit.txtの内容をターミナルに流すと、「pyon」と出力されていることが分かるでしょう。
この辺りの話をしっかりと理解するためには、「UNIXの標準入出力とリダイレクション」が参考になるでしょう。筆者はWindowsに詳しくないため正確なことは言えませんが、おそらくWindowsにも似たような仕組みがあると思います。
Kernelモジュールに定義されている主な入出力メソッド
ここでは、Kernelモジュールに定義されている入出力メソッドのうち、よく使われるものをいくつか紹介しましょう。
最も基本的な出力メソッド「print」
「print」メソッドは、最も基本的な出力メソッドの一つです。引数に与えられた文字列を標準出力に流します。返り値はnilです。pryを起動して動作を確かめてみましょう。
[1] pry(main)> print "Alice" Alice=> nil
「print」+改行で「puts」メソッド
「puts」メソッドも「print」と同様に最も基本的な出力メソッドの一つです。引数に与えられた文字列を標準出力に流しますが、「print」と違って最後に改行を行います。
[2] pry(main)> puts "Alice" Alice => nil
書式付き出力を行うメソッド「printf」
「printf」メソッドは、C言語における「printf」のように、sptintfフォーマットに基づく強力な書式付き出力を行うためのメソッドです。出力を行わずに単に書式適用済みの文字列を得たい場合は、「sprintf」メソッドが使えます。
詳細な記法については、Ruby公式の「sprintfフォーマット」をご覧ください。ここでは、簡単な例を紹介するにとどめます。
[4] pry(main)> printf("%.2f", 3.14159) 3.14=> nil [5] pry(main)> printf("%#b", 42) 0b101010=> nil [6] pry(main)> printf("%+d %d", 42, 42) +42 42=> nil
「printf」の第1引数にフォーマットを、第2引数以降に、表示したいオブジェクトを書きます。[4]では小数点以下の精度を2桁にとどめるような書式を設定しています。
また[5]では、42という整数を2進数で出力しています。[6]は整数を符号付きで表示する場合(`%+d`)と、特に書式指定なしに表示する場合「%d」を一度に表示するようなパターンです。
キーボードから入力された文字列を得るメソッド「gets」
「gets」メソッドは、ユーザーによってキーボードから入力された文字列を得るためによく使われます。io01.rbに「gets」の利用例を示しましょう。
print "please input a string here > " p gets
$ ruby io01.rb please input a string here > Alice↵ "Alice\n"
io01.rbを実行すると、初めに「please input a string here > 」という文字列が表示され、ユーザーの入力を待ち受けます。実行例では「Alice」と入力してエンターキーを押しています。すると、実行結果の2行目のように「p」メソッドがユーザーの入力した内容を画面に表示します。
改行を除去するメソッド「String#chomp」
ここで、「gets」メソッドによって得た文字列には改行(\n)が含まれていることに注意してください。これを除去する典型的な方法として、「String#chomp」メソッドがあります。
print "please input a string here > " p gets.chomp
$ ruby io02.rb please input a string here > Alice "Alice"
テキストファイルを標準入力として使った場合のgetsの動作
ここで、テキストファイルを標準入力として使った場合の動作を観察してみましょう。以下のような内容を持つ、wonderland.txtというテキストファイルを作成してください。
Alice White Rabbit Cheshire Cat March Hare
では、io02.rbにwonderland.txtを入力してみましょう。
$ ruby io02.rb < wonderland.txt please input a string here > "Alice"
wonderland.txtは4行の文字列から成っており、「gets」がつかむのは初めに改行が登場するところまでです。これでは、複数行の入力を扱いたい場合に困ります。実は、「gets」をうまく使えば複数行の入力も扱えます。
while line = gets puts "** #{line.chomp} **" end
$ ruby io03.rb < wonderland.txt ** Alice ** ** White Rabbit ** ** Cheshire Cat ** ** March Hare **
io03.rbでは、whileループのたびに1行ずつ標準入力を読み込み、変数lineに代入しています。入力の末端(EOF:End of File)に達すると「gets」はnilを返すため、「line = gets」の評価値がnilとなり、無事whileループが終了します。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 公用語に英語、「再起動」したRubyKaigi 2013が東京で開催
いったん終了していたRubyコミュニティ主催の年次イベントが再開。技術色、国際色を強め、盛況のうちに幕を閉じた - Web業界、今から行くならRubyエンジニアが狙い目?
不況で冷え込んでいたIT業界の転職市場に、回復の兆しが見え始めている。だが、業種や職種によって採用数や条件に大きな差異が生まれている。転職市場の動向を追い、自身のキャリア戦略立案に生かしてほしい。 - Ruby 2.0.0がリリース、大規模化対応の機能などを搭載
生誕20年となる節目を迎えて、プログラミング言語「Ruby」の最新版がリリースされた - 新バージョンで何が変わるのか、Rubyはどこへ向かうのか:まつもと×笹田、Ruby 1.9を語る
- いよいよ始まるRuby 1.9への移行:開発コアメンバが語るRubyの今とこれから(前編)
- Rubyの今後の進化の方向性とは?:開発コアメンバが語るRubyの今とこれから(後編)
- 互換性や脆弱性の問題にどう対応していくのか:Rubyが抱える課題、NaClの前田氏が講演
- Rails Hub情報局:「なんでRubyなんか作った!? 迷惑だ!」に対するMatzの答え
- Rails Hub情報局:Rubyはイノベーション言語として選ばれている
- Rails Hub情報局:Rubyのまつもと氏は、一発屋で終わるのか?
- Rails Hub情報局:Rubyに魔法は要らない
- 数々の“スペル”で高度なプログラミング:Rubyの魔術
- 晴読雨読@エンジニアライフ:『たのしい開発 スタートアップRuby』――なぜRubyistたちはあれほど楽しそうなのか
- 「JRuby 1.7.0」登場、1年半ぶりのメジャーアップデート
JavaVM上のRuby実装「JRuby」の最新版となる「JRuby 1.7.0」が、10月22日にリリースされた。