みたろーのさんどぼっくす

やってみたあんなことやそんなこととかを、気が向いたらまとめてみるよ。

Regexp、ARGV、そして、ARGF / 7つの言語… Ruby・2日目

7つの言語 7つの世界

7つの言語 7つの世界

先日、時間切れで試せなかった Ruby・2日目の課題「簡易grep」、やってみたよっと。

正規表現でマッチング

これは組み込みライブラリにある Regexp クラスを使えばいい。

コマンドライン引数を受け取る

これは定数 ARGV *1 を使う、と。

と、そこで ARGF なる定数を発見。

ARGF?

Ruby 1.9.3 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > ARGFオブジェクト」の要約から抜粋。

スクリプトに指定した引数 (Kernel::ARGV を参照) をファイル名とみなして、 それらのファイルを連結した 1 つの仮想ファイルを表すオブジェクトです。 ARGV が空なら標準入力を対象とします。 ARGV を変更すればこのオブジェクトの動作に影響します。

今回作ろうとしているものにはピッタリ *2。処理中のファイル名を得ることも(ARGF.filename)、そのファイル中で現在注目している行数(ARGF.file.lineno)を得ることもできる。

自前でガリガリ書かなくていいのはいいね。…途中まで書いてたけど。

できた!

https://github.com/mitaroThanken/seven-languages-in-seven-weeks/blob/master/Ruby/Day2/rb_grep.rb *3

まとめ

とりかかる前に想像した以上にソースがコンパクトになって驚き。

適材適所って、やっぱりあるよな〜と、再認識した次第。

ハマり道

  • new 付けずにオブジェクト作ろうとした(無理
  • 単項演算子 ++ なんてものはない

*1:Ruby 1.9.3 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Kernelモジュール 定数」を参照。

*2:指定されたファイルがないときとか、例外的なコトを考えると使いにくくなるかもしれないけれど。

*3:gistみたいに埋め込めないのかな…?