すがブロ

sugamasaoのhatenablogだよ

劣化版 tail コマンドを改良してみた(2)

前回作った劣化版 tail コマンド

id:seiunsky:20070419:1176997597

通勤途中で読んでいる

この本の中で、open に対する close 処理で、 close 処理を書くのがダルいのでブロック構文で自動的に閉じるようにした、という文章がある。
で、それをみていて、「うんうん、なるほどねー」とフツーに読み飛ばしそうになっていたんだけど、それってこの前の 劣化版 tail にも当てはまるんじゃね? と思いついた(最初に気が付いてろよ)。

というわけで、

ブロック構文でファイルを open させることで、終了時には Ruby 側(っていうのか?)で終了してもらうように修正したのでファイルの close で悩む心配はなくなった。

劣化版 tail (改良版)

こんな感じになった。

#!/usr/bin/ruby

def set_signal_handler
  trap(:INT) {
    exit 0;
  }
end

def usage
  puts "wrong arguments..."
  puts "ex) %rtail filename"
end

set_signal_handler

unless ARGV[0] && FileTest.file?(ARGV[0])
  usage
  exit 1
end

File.open(ARGV[0], "r") { |file|
  loop do
    if file.gets
      print $_
    else
      sleep 1
    end
  end
}

ついでに、実際にファイルがあるかどうかも判定するようにした。こういう構文で良いのかよくわかってないけど。
それにしても、自分で書いておいてなんだけど、ファイル名があるかどうかの判定部分がわかりにくいな。

unless ARGV[0] && FileTest.file?(ARGV[0])

この部分の unless だけど、 unless って一つだけだと良いんだけど、複数の評価式が並ぶと頭が混乱する(´Д`)