Rubyで習作
最近会社でRubyの勉強会をしていて手習でRubyのスクリプトを書いたりする。
http://blog.miraclelinux.com/asianpen/2007/02/ctrlz_bfd3.html
に触発されて、同じような事をするスクリプトをRubyで書いてみた。Ruby歴3日の初心者が書くとこんな感じになるという例として見てほしい。
繰り返しがいっぱいあるのでもっとブロックとか上手に使うとすっきりしそうな気がするのだが全然土地勘がないのでよくわからない。読者諸氏の添削を期待したい。
#!/usr/bin/env ruby
#
# by Hiro Yoshioka
# 2/2/'07: inspired by
# http://blog.miraclelinux.com/asianpen/2007/02/ctrlz_bfd3.html
def makehash(h, f)
while line=f.gets
line=line.chop
h[line]=line
end
end
begin
file1 = File.open(ARGV[0], "r")
hash1 = Hash.new
makehash(hash1, file1)
rescue
puts 'error ARGV[0] ' + ARGV[0].to_s
exit
ensure
file1.close unless file1.nil?
end
begin
file2 = File.open(ARGV[1], "r")
hash2 = Hash.new
makehash(hash2, file2)
rescue
puts 'error ARGV[1] ' + ARGV[1].to_s
exit
ensure
file2.close unless file2.nil?
end
begin
file3 = File.open(ARGV[2], "r")
hash3 = Hash.new
makehash(hash3, file3)
rescue
puts 'error ARGV[2] ' + ARGV[2].to_s
exit
ensure
file3.close unless file3.nil?
end
hash1.each do |key, pkg|
line = pkg.to_s + ', '
line = line + if pkg == hash2[pkg]
"included, "
else
"not included, "
end
line = line + if pkg == hash3[pkg]
"included\n"
else
"not included\n"
end
print line
end
どうでしょうか?




File.openはブロック使うと自分でcloseせずに済みますよ。
投稿: kdmsnr | 2007年2月 2日 (金) 16:47
kdmsnrさん、コメントありがとうございます。
検討してみます。
投稿: hyoshiok | 2007年2月 2日 (金) 19:39
オブジェクト指向的に書いてみました。ご参考まで。
#!/usr/bin/env ruby
class Distribution
attr_accessor:pkglist
def initialize(file)
@pkglist = Array.new()
File.open(file) do |f|
f.each do |line|
@pkglist.push(line.chomp)
end
end
end
def is_include?(pkg)
if (@pkglist.include?(pkg))
"include"
else
"not-include"
end
end
end
ins_asianux = Distribution.new(ARGV[0])
ins_distA = Distribution.new(ARGV[1])
ins_distB = Distribution.new(ARGV[2])
ins_asianux.pkglist.each do |pkg|
printf("%s, %s, %s\n", pkg, ins_distA.is_include?(pkg),ins_distB.is_include?(pkg))
end
投稿: kyagi | 2007年2月 2日 (金) 20:31
素人ですが、ちょっと背伸びして書いてみました。
投稿: bonlife | 2007年2月 2日 (金) 20:48
こんなのはどうでしょうか。
Perlっぽいかもしれませんが。
> #!/usr/bin/env ruby
> def makearray(file)
> open(file) {|io| io.readlines }
> end
> f1 = makearray(ARGV[0])
> f2 = makearray(ARGV[1])
> f3 = makearray(ARGV[2])
> f1.each{|k|
> print k.chomp, ", ",
> f2.include?(k) ? "included, " : "not included, ",
> f3.include?(k) ? "included\n" : "not included\n"
> }
投稿: masaka | 2007年2月 2日 (金) 20:51
おお、みなさん、作品ありがとうございます。すごいすごい。あっという間にいろいろなスタイルのコードが集まりました。
kyagiさん、コメント欄だと空白(インデント)がなくなっちゃうので、良さが半減ですが、なかなか、いい感じですね。
bonlifeさん、Array版ありがとうございます。文字列の連結は<<が速いのですね。勉強になります。
http://d.hatena.ne.jp/t-tkzw/20060709/p3
masakaさん、随分シンプルになるんですねえ。
ありがとうございました。
投稿: hyoshiok | 2007年2月 2日 (金) 22:28