テキストファイルの内容をソートするプログラム その4 「パターンマッチと負の添字」

■変更点

  1. 読み込めるファイルを.txtと.csvに限定
  2. 文字列判定に比較演算子(=~)を使用


file_path = ARGV[0]
search_str = ARGV[1]

if /^(txt|csv)$/i !~ file_path.split(".").[](-1)
puts "扱えないファイルです。"
exit
end

temp_lines = []
File.open(file_path) { |f|
f.each do |line|
temp_lines << line
end
}

temp_lines.sort!

File.open("result_" + file_path, "w") { |f|
temp_lines.each do |line|
if /#{search_str}/ =~ line
f.puts line
end
end
}

■解説
  • 「=~」はパターンマッチに使われる演算子で、
    マッチした場合は位置(先頭)を、マッチしなかった場合は「nil」を返します。
    Rubyの条件式で「0」は「真」なので、マッチすれば「真」となります。
    また、その3まで使っていたmatchメソッドは、マッチした部分文字列を返します。


  • 「!~」は「=~」の否定演算子で、マッチした場合は「false」、
    マッチしなかった場合は「true」を返します。


  • 「/^(txt|csv)$/i」の「i」は正規表現のオプションで、
    英字の大文字と小文字を区別しない設定です。(ただし半角に限る)


  • 「.[](-1)」は、「[-1]」と同義です。
    Rubyでは、配列の添え字に負の数を指定すると、
    後ろから○番目の値を取得できます。