cat -nもどき

何となくcat -nもどきを作ってしまったので投棄。2パスにして行頭の余分なスペースをなくしてみた(賛否両論あるだろうなー、この仕様は)。

#!/usr/bin/env ruby
# -*- ruby -*-
# $Id: catn,v 1.1 2005/03/27 12:34:04 s-tanaka Exp $
# 
# usage: catn [files ...]
#

def get_ncolumn(file)
  while file.gets
  end
  Math.log10(file.lineno).to_i + 1
end

def ncat(ncolumn, file)
  while line = file.gets
    printf("%*d %s", ncolumn, file.lineno, line)
  end
end

ARGV.each do |filename|
  open(filename, 'r') do |file|
    ncolumn = get_ncolumn(file)
    file.pos = 0
    file.lineno = 0
    ncat(ncolumn, file)
  end
end

printfの"%*d"は珍し気だな。printf(3)より該当部分をコピーしとく。

     A field width or precision, or both, may be indicated by an asterisk `*'
     instead of a digit string.  In this case, an int argument supplies the
     field width or precision.  A negative field width is treated as a left
     adjustment flag followed by a positive field width; a negative precision
     is treated as though it were missing.

このツールは、主にこの日記のソースコード貼り付け時に使用する予定。
しかしRubyは楽だ。こんなツールをDynamic Language以外で実装しようなんて、まず思わないな(もちろん、お仕事を除いて)。