新井です。

>>> From: kikutani / sprintmail.com
>>> Date: 24 May 1999 23:28:37 +0900
>>> Subject: [ruby-list:14481] count lines

> きくたにです。
> readで全部ファイルを読んで、それが何行あるか知るには
> どうやるのが簡単でしょうか?
> 
> ---
> s = nil
> open("count-cr.rb") {|f| s = f.read}
> sa = s.split(/\n/)
> 
> p sa
> p sa.size
> 
> 
> ---

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

さらに、配列の生成を嫌うなら以下はどうでしょう?
# 速度の効率は検証してませんが

---
s = nil
n = 0
open("count-cr.rb") {|f| s = f.read}
s.scan(/\n/) { n += 1 }

p n


---

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

これは、第2引数が省略されたsplitの仕様ですね。
split(/\n/, -1)とすればよいのだけど、そうすると最
初の処理では9になっちゃいます。わかりますよね?

で、この質問に便乗なんですけど。あるセパレータで切
り出した文字列をさらに1行ずつ切り出したいことがた
まにあります。これの良い方法はありませんか?

私は以下のようなString#getsメソッドを使ってますが、
やっぱり効率悪いでしょうか?

class String
  def gets
    self.sub! /.*\n/, ""
    $&
  end
end

while page = gets("\cL")

  while line = page.gets
    p line
  end
end