データファイルとして以下のものを用意する。
area.dat
鶴岡市 141479 67147 74332 酒田市 116234 55213 61021 三川町 7953 3841 4112 遊佐町 16685 7846 8839 庄内町 24304 11552 12752
これを読み込んで実行すると、以下のようになる
% ./ranking.rb データファイルを指定して下さい。 実行例: % ./ranking.rb datafile.dat 総面積順に出力 % ./ranking.rb -a datafile.dat 農用地面積順に出力 % ./ranking.rb -f datafile.dat 森林面積順に出力 % ./ranking.rb area.dat --地区---------総面積-------農用地-------森林--- 鶴岡市 141479 67147 74332 酒田市 116234 55213 61021 庄内町 24304 11552 12752 遊佐町 16685 7846 8839 三川町 7953 3841 4112 ./ranking.rb -a area.dat --地区---------総面積-------農用地-------森林--- 鶴岡市 141479 67147 74332 酒田市 116234 55213 61021 庄内町 24304 11552 12752 遊佐町 16685 7846 8839 三川町 7953 3841 4112 ./ranking.rb -f area.dat --地区---------総面積-------農用地-------森林--- 鶴岡市 141479 67147 74332 酒田市 116234 55213 61021 庄内町 24304 11552 12752 遊佐町 16685 7846 8839 三川町 7953 3841 4112
地区名と、その面積を読み取る部分では、ハッシュ用変数area
を用意して、
area[地区名] = [総面積値, 農用地面積値, 森林面積値 ]
という風に代入を行なっている。並べ替える部分は以下のようになっている。
for div in area.keys.sort {|x, y| area[x][項目番号] <=> area[y][項目番号] }.reverse …… end
実行例では -a
や -f
でソート基準を
変更するようになっている。プログラムの引数にハイフンで始まる文字を
指定して動きを変えることはよく利用される。この場合 -a
や
-f
をオプションという。ARGV
配列を
先頭から調べて行き,あらかじめ決めたオプションに一致したら動きを変えるよ
うにする。完成形プログラムの前半は以下のようになる。
if ARGV[0] == nil STDERR.print "データファイルを指定して下さい。 実行例: % ./ranking.rb datafile.dat 総面積順に出力 % ./ranking.rb -a datafile.dat 農用地面積順に出力 % ./ranking.rb -f datafile.dat 森林面積順に出力 " exit 1 end sortby = 0 # デフォルトは総人口でソート while /^-/ =~ ARGV[0] # ハイフンで始まる間繰り返す if ARGV[0] == "-a" (ソート規準を農用地にする) elsif ARGV[0] == "-f" (ソート規準を森林にする) else break end ARGV.shift end area = Hash.new : : (以下省略)