btoメモ

なんか適当に書く

ARGFを作った

ARGFとは

rubyで使える機能で、入力を抽象化してくれます。

ARGFを使うとフィルタプログラムのようなコマンドラインプログラムが簡単に書けます。

ARGF

これ、とっても便利でrubyでプログラム書くときは(知らずに)よく使います。

ARGFを使うと入力が標準入力だろうが、ファイルが引数で複数渡されようが、プログラムを全く変更しないで動作させることができます。

% vim cat.rb # cat と同じプログラム

ARGF.each {|line| print line} # 本当はもっと簡単に書ける

% ruby cat.rb < cat.rb # 標準入力から

% ruby cat.rb foo.txt bar.txt # 引数に複数ファイル渡しても大丈夫

phpでは

コマンドラインのプログラムが書きづらい。 ><

もともとweb用の言語なので、しょうがないといえばしょうがないかもしれない。

とはいえ、phpのプロジェクトをやってるとコマンドラインのプログラムもphpで書くわけです。

php用ARGF作った

php用のARGFを作ってみました。

php4, php5両方で動きます。

codereposにコミットしました。

ARGF

サンプル

% vim cat.php # catと同じプログラム

require_once('ARGF.php');

while ($line =& $ARGF->each()) {

echo $line;

}

% php cat.php < cat.php # 標準入力から

% php cat.php foo.txt bar.txt # 引数に複数ファイル渡しても大丈夫

使い方

require_once('ARGF.php');

ファイルをインクルードすると$ARGC, $ARGV, $ARGFが定義されます。

$ARGC

コマンドラインの引数の数になります。

ARGF::ARGC(); でも取り出せます。

$ARGV

コマンドラインの引数の配列になります。

ARGF::ARGV(); でも取り出せます。

$ARGF

メインのオブジェクトです。

他の関数の中とかスコープが閉じたところで使いたい場合は、適当にインスタンスを取り出してあげてください。

$ARGF = new ARGF();

$ARGF = ARGF::getInstance();

$ARGF->each()

一行ずつ取り出します。

$ARGF->toArray()

全ての入力を一行ずつの配列に変換します。

$ARGF->toString()

全ての入力を一つの文字列に変換します。

$ARGF->line

現在読み込んでる仮想的な行番号を示します。

$ARGF->filename

現在処理しているファイル名を示します。

まとめ

ARGFを使うとコマンドラインのプログラム書くのが楽になるよ!!

実はちょっと前に飲み会から帰ってきて勢いで作ったんだけど、せっかくだからcodereposに公開。