作者: Kazuhiro Yoshida
日時: 2002/4/27(09:50)
もりきゅうです。

いきなりですが始まりましたこの講座。担当は私もりきゅうでございます。
最近Ruby本はたくさんあるので、文法にはあんまり触れないつもり。
いまいち対象読者がわかんない。TSNET って実は初心者いないんじゃ.. ^^;

■ フィルタ

Rubyを簡単に使ってみる例としてよくフィルタが取り上げられます。フィ
ルタとは標準入力から流れてきたデータに加工を施し標準出力へ流すプロ
グラムのことです。

--^ cat0.rb
while gets
  print
end
--$

これは三行のRubyプログラムです。--^ ファイル名 から --$ までをひと
つのファイルとみてください。

--^ memo.txt
memo
--$

というテキストファイルが cat0.rb と一緒に置いてあったら

$ ruby cat0.rb memo.txt

とすれば memo.txt の内容が表示されます。(先頭の $  はコンソールの
プロンプトです)

=begin win32

UNIX環境の方はよく解っていることだろうと思いますのではしょりますが
、Windows環境でMS-DOSプロンプトを使われる方のために少し。ruby.exe
はコンソールから使うことを前提に作られています。MS-DOSプロンプトも
コンソールの端くれではありますが、へぼい。これをもうちょっとましに
使えるようにするための方法を紹介します。私の環境(WindowsME)での話
ですので若干異なるかもしれません。

挿入モードになっていない方は

C:\>doskey /insert

としてください (先頭の C:\> はプロンプトを示します) 。こうすると履
歴が使えるようになります。

C:\>ruby cat0.rb memo.txt

と打って、最後に Enterキーを押せば memo.txt の内容が表示されます。
挿入モードでは上矢印を押すと以前入力したコマンドを順に呼び戻せます
。活用してください。

また、頻繁に使うコマンドはバッチファイルとして保存しておくと便利で
す。

--^ cat0.bat
ruby cat0.rb memo.txt
--$

このようなファイルを用意しておくと

C:\>cat0

と打って、最後に Enterキーを押せば memo.txt の内容が表示されます。
とは言っても、今回は

C:\>type memo.txt

で済む話ではありますけども。そんなこと言ったら

C:\>ruby -pe 0 memo.txt

でいいじゃんとか言われそう。^^; ということでRubyの話に戻りましょう。

=end

実は、cat0.rb ではまるで Perl であるかの如く、隠れた変数 $_ が暗躍
しています。

while $_ = gets
  print $_
end

この隠れた変数 $_ を利用するとストローク数が減って便利ではあります
が、バグの温床でもあります。できることなら頼らないようにしましょう。

--^ cat1.rb
while line = gets
  print line
end
--$

このほうが健全です。

フィルタ処理では行末の改行を落とすためによく chomp が使われます。
そうです。cat1.rb の line にはお尻に改行がくっついているのです。

--^ cat2.rb
while line = gets
  print line.chomp, "\n"
end
--$

cat1.rb と cat2.rb の違いは何でしょう? それは

--^ note.txt
note--$

このような改行で終わっていない (改行で終わっていないことを示すため
に --$ を行末にくっつけました) ファイルを扱う際に現れます。cat2.rb
では、入力が改行で終わっているいないにかかわらず、出力の行末には必
ず改行が付きます。

=begin win32

話は飛びますが、先ほどMS-DOSプロンプトのところで紹介したバッチファ
イルは、最後に改行があると空処理が入りますので、最後の改行は削除し
たらいいかもしれません。さらにコマンドの頭に @ を付けるとそのコマ
ンドラインは表示されなくなります。つまり

--^ cat1.bat
@ruby cat1.rb note.txt--$

このようにしたほうが出力がきれいです。

=end

出力における改行の話として puts にも触れておきましょう。

--^ cat2a.rb
while line = gets
  puts line.chomp
end
--$

--^ cat2b.rb
while line = gets
  puts line
end
--$

puts は最後に必ず改行を出力します。ただし line の最後が改行であっ
た場合はその限りではありません。cat2a.rb と cat2b.rb は実質的に同
じです。

----
YOSHIDA Kazuhiro  moriq@...  http://www.moriq.com/