01  =begin
02  
03  lineno2.rb:
04  
05  テキストファイルを読み込んで,各行の先頭に行番号を付加する.
06  出力先ファイルが与えられていれば,そのファイルに結果を書き出す.
07  出力ファイルが与えられていない,あるいは出力先が"-"の場合は,
08  標準出力に書き出す.
09  
10  =end
11  
12  # 引数の個数チェック -> 足りない場合は終了
13  if ARGV.size < 1
14    STDERR.print "#{File.basename($0)} inputfile [outputfile|-]\n"
15    exit(1)
16  end
17  
18  infile=ARGV.shift  # 入力ファイル名
19  outfile=ARGV.shift # 出力ファイル名(nilか-である場合もあり得る)
20  
21  # 入力ファイルから1行ずつ読みこんで配列に取り込む
22  in_lines = []
23  fin = File.open(infile,"r") 
24  while line = fin.gets
25    in_lines.push(line)
26  end
27  fin.close 
28  
29  n = in_lines.size # 行数
30  d = Math.log10(n).floor + 1 # nの10進数での桁数
31  fmt = "%0#{d}d %s" # d桁の数字を付加する出力書式
32  fout = (outfile == "-" or (not outfile)) ? STDOUT : File.open(outfile,"w")
33  in_lines.each_with_index do |line,j|
34    fout.puts fmt % [j+1,line]
35  end
36  fout.close unless fout == STDOUT