MIRACLE
メールサービス申込 ユーザー登録 パートナー情報
お問い合わせ FAQ サイトマップ
MIRACLE LINUXの特長 製品紹介 サービス案内 購入 サポート 技術フォーラム

プロフィール

吉岡 弘隆 - よしおか ひろたか

日本OSS推進フォーラム ステアリングコミッティ委員
OSDL Board of Directorsを歴任
カーネル読書会主宰

2000年6月、ミラクル・リナックスの創業に参加。
95年~98年、米国OracleにてOracle RDBMSの開発をおこなっていた。
98年にNetscapeのソースコード公開(Mozilla)に衝撃をうけ、オープンソースの世界に飛びこみ、ついには会社も立ち上げてしまう。
2008年6月取締役CTOを退任し一プログラマとなった。

ミラクル関連リンク

なかのひと

サイト検索

2009年6月

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

« ISO/IEC 15408の取得 | メイン | アーキテクチャの設計寿命 »

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

どうでしょうか?

トラックバック

このページのトラックバックURL:
http://www.typepad.jp/t/trackback/4447/6771592

このページへのトラックバック一覧 Rubyで習作:

» [IT][勉強][Ruby] 3つのテキストファイルを比較するサンプル (Ruby素人編) トラックバック bonlife
VMWare Serverを会社のノートPCにインストールして、CentOS使ってあれこれ実験しようとしたところ、yumが妙なエラーで止まってしまい苦戦しているbonlifeです。FAQの5番目にある”[Errno -1] Header is not complete.”ってヤツですよ…。ということで、挫折感に打ちひしがれ... [続きを読む]

» ユメのチカラ: Rubyで習作 添削 トラックバック Matzにっき
よしおかさんがRubyコードを書いてるっ。 私の中で評価が高い人がRubyを使ってるのを見ると、ちょっとうれしい。 増田さんがRuby使いはじめたのを見た時もうれしかったなあ。 で、当の吉岡さんのコードだが、ちょっと冗長な印象がある。 特に三回あるmakehashメソッド呼び出しの周辺がいかにも同じことの繰り返しである。 ここは ハッシュ生成 ファイルオープン ファイルのクローズ 例外処理 などをぜんぶmakehashメソ... [続きを読む]

» [Ruby] Set トラックバック maoeのブログ
ユメのチカラ: Rubyで習作 ユメのチカラ: Rubyで習作 添削 キーと値が同じなので,こういうときはSetを使うといいんではないかと思いました. require ’set’ def makehash(path) open(path, r) {|f| f.inject(Set.new) {|r, i| r.add(i.chop) } } rescue puts ’er... [続きを読む]

» ruby - 添削 - もっとDRYに トラックバック 404 Blog Not Found
Matzさん自ら添削というのもなんともうらやましいのだけど、 ユメのチカラ: Rubyで習作読者諸氏の添削を期待したい。 これでもDRYさが足りないと思うので、さらに添削。 Matzにっき(2007-02-02)などをぜんぶmakehashメソッドに詰め込んで、DRYで行こう。 #逆年功序列な....... [続きを読む]

» [OOPL][Squeak][Smalltalk] 3つのファイルから比較表を作成 トラックバック sumim’s smalltalking-tos
404 Blog Not Found:ruby - 添削 - もっとDRYに と、Matzにっき- ユメのチカラ: Rubyで習作 添削 経由で。キミならどう書く?的なノリでトライしてみました。例によって、Squeak の Smalltalk で書いてから、あとで Ruby の直訳っぽいのを載せます。 まず Squeak の Smallta... [続きを読む]

» [Ruby]吉岡弘隆さんの「Rubyで習作」を添削 トラックバック Tociyuki::Diary
吉岡弘隆さんのパッケージ・リストのディストリビュート間の比較表作成 ruby スクリプトを私の流儀に直してみました。 ⇒ http://blog.miraclelinux.com/yume/2007/02/ruby_b40b.html まず、パッケージ・リスト・ファイルを全行読み込んでハッシュにしているということは、... [続きを読む]

» Rubyで習作の性能評価 トラックバック ユメのチカラ
うひょ〜。大変なことになった。手習いで書いた初めてのRubyプログラムが大御所に [続きを読む]

» 「Rubyで習作」の添削達 トラックバック HonokaBlog
「Rubyで習作」の添削達 ユメのチカラ Rubyで習作 に吉岡弘隆さんのRubyプログラムが掲載されていていろんな人が添削しています。 プログラムの内容は親(?)ファイルにLinuxディストリビューションのパッケージ情報が入っていて、 (複数の)子(?)ファイルにそれが入っている場合includeと、入っていない場合not-includeと表示するものです。 (各行がパッケージ名、各列が各ディストリビューションのテーブルとなる) 個人的には... [続きを読む]

コメント

File.openはブロック使うと自分でcloseせずに済みますよ。

kdmsnrさん、コメントありがとうございます。

検討してみます。

オブジェクト指向的に書いてみました。ご参考まで。

#!/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

素人ですが、ちょっと背伸びして書いてみました。

こんなのはどうでしょうか。
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"
> }

おお、みなさん、作品ありがとうございます。すごいすごい。あっという間にいろいろなスタイルのコードが集まりました。

kyagiさん、コメント欄だと空白(インデント)がなくなっちゃうので、良さが半減ですが、なかなか、いい感じですね。

bonlifeさん、Array版ありがとうございます。文字列の連結は<<が速いのですね。勉強になります。
http://d.hatena.ne.jp/t-tkzw/20060709/p3

masakaさん、随分シンプルになるんですねえ。

ありがとうございました。

コメントを投稿

会社情報 採用情報 個人情報保護方針 商標等取り扱い事項 English
Copyright(c)2000-2006 MIRACLE LINUX CORPORATION. All Rights Reserved.