catとhead

UchのX40記: [Ruby]catとheadより.
catは,正直言いまして,簡単な解答*1ならアレでよい気がする.そして,catよりはheadの方が面白そう.
headは,折角だからオプション指定とかできるようにした.

def usage
  STDERR.print("usage: #{$0} [-c N] [-n N] [file...]\n" + 
               "-c N : print first N bytes\n" +
               "-n N : print first N lines\n" +
               "-v   : print filename\n")
  exit 1
end

opt_byte = false
opt_line = false
opt_name = false

bytes = nil
lines = nil # ここで先にデフォルトを指定しておくのもアリよね

# オプションを取る
while ARGV[0] =~ /^-/
  $_ = ARGV.shift
  if $_ =~ /^-c$/
    opt_byte = true
    if ARGV[0] =~ /^\d+$/
      bytes = ARGV.shift.to_i
    else
      usage
    end
  elsif $_ =~ /^-n$/
    opt_line = true
    if ARGV[0] =~ /^\d+$/
      lines = ARGV.shift.to_i
    else
      usage
    end
  elsif $_ =~ /^-v$/
    opt_name = true
  end
end

lines = 10 unless opt_line

while filename = ARGV.shift
  f = open(filename)
  puts "--[" + filename + "]--" if opt_name
  unless opt_byte
    lines.times do
      if l = f.gets then print l else break end
    end
  else
    tmp = bytes
    chars = f.gets(nil).split(//)
    chars.each do |char|
      break if bytes < 1
      bytes -= 1
      print char
    end
    puts
    bytes = tmp
  end
  f.close
end

もっといいのあったら、教えて頂戴。

良くはないよね:p


何はともあれ,実行して見るとこんな感じになります.

$ ruby head.rb -v -c 3 head.rb
--[head.rb]--
def
$ ruby head.rb -v -n 3 head.rb
--[head.rb]--
def usage
  STDERR.print("usage: #{$0} [-c N] [-n N] [file...]\n" + 
               "-c N : print first N bytes\n" +
$ ruby head.rb -v -n head.rb
usage: head.rb [-c N] [-n N] [file...]
-c N : print first N bytes
-n N : print first N lines
-v   : print filename

オプション指定は正直言って自己満足の世界だと思う.

*1:オプション云々を抜きにして