なので、String#chompするとかString#split("\n")するとかそういう方向で。

挙動を調べるためのサンプルコード。


$ uname -m -r -s -v
Linux 2.6.26-2-amd64 #1 SMP Tue Jan 25 05:59:43 UTC 2011 x86_64

$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]

$ cat ./sample.rb
f = File::open($*[0])
lines = f.readlines()
lines.each{|line|
  puts line.inspect
}
lines.each{|line|
  puts line.chomp.inspect
}

$ cat ./hoge.txt
Hello, Good-bye!
Hello, world.
This is a pen.

$ ruby ./sample.rb ./hoge.txt
"Hello, Good-bye!\n"
"Hello, world.\n"
"This is a pen.\n"
"\n"
"Hello, Good-bye!"
"Hello, world."
"This is a pen."
""

Ruby 1.8.7 リファレンスマニュアルによると……

readlines(path, rs = $/) -> [String]

path で指定されたファイルを全て読み込んで、その各行を要素としてもつ配列を返します。

既に EOF に達していれば空配列 [] を返します。 Kernel.#open と同様 path の先頭が "|" ならば、"|" に続くコマンドの出力を読み取ります。

[PARAM] path:
ファイル名を表す文字列か "|コマンド名" を指定します。
[PARAM] rs:
行の区切りを文字列で指定します。rs に nil を指定すると行区切りなしとみなします。空文字列 "" を指定すると連続する改行を行の区切りとみなします(パラグラフモード)。

singleton method IO.readlines
$/ -> String | nil
$-0 -> String | nil

入力レコード区切りを表す文字列です。 awk の RS 変数のように働きます。

Kernel.#gets のような「行」単位の読み込みメソッドが「行」の区切りとして使用します。 Rubyがコマンドオプション -0 付きで起動されたときには -0 で指定された値が規定値となります。そうでないとき、規定値は "\n" です。

この変数に nil を設定すると読み込みメソッドはファイル全体を一度に読み込みます。空文字列 "" を設定するとパラグラフモードとみなされ、 2 つ以上連続した改行が「行」の区切りになります。

$/ には正規表現は使えません。

この変数はグローバルスコープです。

variable $-0

特に何も書いてなかった。。。

tags: ruby

Posted by NI-Lab. (@nilab)