Hatena::Grouprubyist

krystal: プログラミング超初心者(文系)

2008-12-25 (Thu)たのしいRuby練習問題

★☆★☆★☆★☆★ ⊱❤❤❤Merry Christmas!!❤❤❤⊰ ★☆★☆★☆★☆★

19:41

P285 IOクラス練習問題(1)

  • あるファイルの内容を別のファイルにそのままコピーするメソッドcopy_fileを定義しよう
def copy_file(file1, file2)
  open(file1){|from|
    open(file2, "w"){|to|
      while line = from.gets
        to.write(line)
      end
    }
  }
end
copy_file("test.rb", "copy.rb")

コピー元であるfile1から一行ずつgetsして、コピー先ファイルであるfile2へwrite

[2009/01/06]先ほど本を読んだらこのような書き方があった

def copy_file(file1, file2)
  open(file1){|from|
    open(file2, "w"){|to|
      to.write(from.read)
    }
  }
end
copy_file("test.rb", "copy.rb")

P285 IOクラス練習問題(2)

  • Unixで使われるtailコマンドと似たことができるメソッドtailを定義しよう
def tail(line_num, file)
  arr = []
  arr2 = []
  open(file){|f|
    while line = f.gets
      arr << line
    end
  }
  for i in 1..line_num
    arr2 << arr.pop
  end
  puts arr2.reverse

end
tail(11, "copy.rb")

fileから内容を一行ずつ配列arrに入れて、配列arrからline_num回popしたもの(行)を別の配列arr2に入れる。arr2をreverseして出力。

readlinesを使ってみた
def tail(line_num, file)
  open(file) {|f|
    puts f.readlines[(f.readlines.size - line_num)..(f.readlines.size - 1)]
  }
end
tail(7, "copy.rb")

entottoentotto2008/12/25 20:09tail コマンドの魅力は -f オプションだと思います。

「tail.rb -f -n 10 some.log を実行したら、some.logの最後10行を出力したまま、終了せずに、some.logに何か追記されたらさらにそれを出力する。」ような tail.rb がほしいなぁ。> サンタさん

ちなみにファイルへの追記は >> を使うとできます。
$ echo "abc" >> some.log

krystalkrystal2009/01/06 13:18>entottoさん
コメントありがとうございます。
昨日vm wareを使ってtail -fコマンドを確認してみて、どういう動作するかが分かりました。やり方考えてみます。