新井です。 >>> 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