sort コマンドの実装(その2)

ruby で sort コマンドを実装。今回は "-r", "-n" オプションを実装してみた。

require 'optparse'

class DefaultSort
  def compare(a, b)
    a <=> b
  end
end

class NumericSort
  def compare(a, b)
    /^(\d*|\s+\d+)(.*)$/ =~ a
    a1, a2 = $1, $2
    /^(\d*|\s+\d+)(.*)$/ =~ b
    b1, b2 = $1, $2

    r1 = a1.to_i <=> b1.to_i
    if r1 != 0
      r1
    else
      a2 <=> b2
    end
  end
end

sort = DefaultSort.new
reverse = 1

opt = OptionParser.new
opt.on("-n", "--numeric-sort") {|v| sort = NumericSort.new}
opt.on("-r", "--reverse") {|v| reverse = -1}
opt.parse!(ARGV)

ARGF.sort {|a, b| sort.compare(a, b) * reverse}.each {|v| print v}