雑記

2000|01|
2003|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|
2007|01|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|09|11|
2009|02|03|05|06|07|08|10|11|12|
2010|01|03|04|05|06|07|08|09|10|
2011|05|06|09|10|
2012|03|07|09|12|
2013|01|02|04|05|07|08|10|11|
2014|04|05|08|10|12|
2015|01|05|
2016|09|
2024|06|
2025|01|

2009-08-10 [長年日記]

[Ruby]1行ずつ処理する

与えられた文字列を1行ずつ処理しようとして、

str.split(/\r?\n/).each { |l| ... }

とかやってはまってしまいました。

"\na".split(/\r?\n/) -> ["", "a"]

とか、

"\n\na".split(/\r?\n/) -> ["", "", "a"]

は期待通りなんですが、空行が末尾にくると

"\n".split(/\r?\n/) -> [] (期待は[""])
"\n\n".split(/\r?\n/) -> [] (期待は["", ""])

となってしまいます。

で、迷走して

"\n".split(/\r?\n/, -1)[0..-2] -> [""]

とかやってたんですが、今度は処理する文字列の最後に改行がない場合にうまくいかない。

とかさんざんやった後からeach_lineメソッドを見つけたりするわけです。というわけで正解は以下。

str.each_line { |l| l.chomp! ... }