tree.rb

今日は久しぶりに,Rubyあれこれのコードを写経しながら勉強.今回のお題は,http://homepage1.nifty.com/~tetsu/ruby/cmd/tree.htmlです.
少なからず,ボクのmacにtreeコマンドは確認できなかったので,丁度良い機会です.完成したら/usr/local/binにでも突っ込むか,ぐらいの意気込みでやりました.


なんとか写経できましたが,「tree.rb -d ~」なんてしてしまうと,大変でした.あちゃーって.それじゃ復習をしていきます

変数の頭についた$

簡単なスクリプトでは滅多にお目にかかる事が無いであろう,グローバル変数.個人的に好きではないけど,グローバル変数を使うと,コードを書くのが一気に楽になったりするものです.

lstat

Fileオブジェクトの,lstatというメソッド.シンボリックリンクに対してリンクそのものの情報を返すんだそうで.シンボリックリンクじゃなかったら,普通に情報を返すとか.

irb(main):001:0> File.lstat("tree.rb")
=> #<File::Stat dev=0xe000002, ino=2249039, mode=0100755, nlink=1,
 uid=501, gid=501, rdev=0x0, size=1756, blksize=4096,
 blocks=8,  atime=Fri May 05 22:19:00 JST 2006, 
 mtime=Fri May 05 22:17:56 JST 2006, ctime=Fri May 05 22:18:14 JST 2006>

しかしながら,.directory?がどのようにしてそのファイルないしディレクトリを,この情報からディレクトリであるか否かを判別しているのか・・・.

irb(main):001:0> File.lstat("study")
=> #<File::Stat dev=0xe000002, ino=1742386, mode=040755, nlink=23,
 uid=501, gid=501, rdev=0x0, size=782, blksize=4096,
 blocks=0, atime=Fri May 05 22:24:40 JST 2006,
 mtime=Fri May 05 22:19:12 JST 2006, ctime=Fri May 05 22:19:12 JST 2006>

これはstudyというディレクトリの情報.あ,modeで判別してるっぽいですね.

Dir

Dio(WRYYYYY)ではありませんよ.

dirp = Dir.open(".")

この処理で,dripに何が入るのか?

drip.each{|f|
  puts f
}

とすると,カレントディレクトリのファイル名がでてきます.しかしこれ,二回eachが出来ないんだよね.なんでだろう.Fileでも言える事だけども・・・.

dir = Dir.open(".")
dirp.each{|f|
  print f, "?t" if f !~ /^?./
}
puts

これで,簡単なlsコマンドの出来上がり.勿論,実用化には程遠いけど.なんだか筋肉痛が酷いので,今日はコレぐらいで終わります.