きくたにです。

On Mon, 24 May 1999 23:50:27 +0900,
gotoken / math.sci.hokudai.ac.jp (GOTO Kentaro) wrote:

> ほんとに数えるだけなら、
> 
> open("count-cr.rb"){|f| f.read }.scan(/$/).size
> 
> でどうでしょ?? "\n" を数えたいなら /$/ は /\n/ です。

On Mon, 24 May 1999 02:12:23 +0900 
Koji Arai <JCA02266 / nifty.ne.jp> wrote:

> split を scan に置き換えるとよいですね。

なるほど、scanですか。気付かなかった。grepとかfindは考えたけど。

なお、私が秘かに書いている「かっこいいrubyist像」というメモには
「scanやcollectをさりげなく使える」という項目があります。

# ふ、俺はまだまだだぜ。

ところで、/\n/ じゃなく /$/ を使うというのは改行コードに
独立させるということですね。
 
> さらに、配列の生成を嫌うなら以下はどうでしょう?
> # 速度の効率は検証してませんが
> 
> ---
> s = nil
> n = 0
> open("count-cr.rb") {|f| s = f.read}
> s.scan(/\n/) { n += 1 }

これは直観的にはどっちが速いかわかりませんね。
多くて千くらいの要素だから、あまり気にしないことにしよう。

> > ところで、上の例で最後に空行ふたつあるのはわけがありまして、
> > 上を実行すると(プログラムがcount-cr.rbです)、行として6が表示されます。
> > 8を期待してたのに、なぜ最後の空行が無視される?
> 
> これは、第2引数が省略されたsplitの仕様ですね。

そうか、readの問題じゃなくsplitのせいだったか。

-- 
Kikutani, Makoto  kikutani / sprintmail.com