きくたにです。 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