近藤ともうします。

ruby でプログラムを書いてみたのですが、なんか、しっくり来ないので、
ruby 流の書き方に添削して欲しいのですが、構わないでしょうか。

プログラムは以下のとおりで、これは、IHX8M という、ROM に書き込む時とか
に使われるファイルフォーマットを解釈する、Ihx8m というクラスです。

IHX8M は先頭に コロン、次にその行の長さ、アドレス、識別子、データ、チェッ
クサムと続く行形式のデータです。サンプルデータをその次に示します。

ixh.rb の最後でコメントにしてある部分を有効にすると、このプログラムで
私が期待した動作はしています。
動作環境は ruby 1.1b6(98/01/23) [i586-linux] です。

データメンバの初期化、配列の使い方、イテレータの使い方
文字列の処理方法など、がとくに良くわからなかったので、
思考錯誤で書いています。

--
近藤靖浩 <nkon / osk2.3web.ne.jp>
http://www2.osk.3web.ne.jp/~nkon/3web/
http://tsl.pe.u-tokyo.ac.jp/~kon/tslhome/

-- ihx.rb

class Ihx8m
  def initialize(filename = nil)
	if (filename)
	  parse(filename)
	end
  end

  # ファイルの解釈
  def parse(filename)
	@memory = Array.new
	file = open(filename)
	file.each_line do |line|
	  break if (line == ":00000001FF\n")
	  parse_line(line)
	end
  end
  
  def memory
	@memory
  end

  # 一行解釈
  def parse_line(line)
	line.chop!
	sum = 0;
	leader = (line[0,1]).hex; line[0,1] = "";
	length = (line[0,2]).hex; sum += length; line[0,2] = ""
	address = (line[0,4]).hex/2;
	sum += line[0,2].hex + line[2,2].hex;line[0,4] = "";
	type = line[0,2]; line[0,2] = "";
	checksum = (line[line.length-2,2]).hex; line[line.length-2,2] = ""
	data = line

	rep = 0;
	while(data.length > 0)
	  sum += data[0,2].hex + data[2,2].hex
	  value = (data[2,2] + data[0,2]).hex
	  data[0,4] = ""
	  @memory[address] = value
	  address += 1;
	end
	if ((~(sum-1) & 0x00ff) != checksum)
	  raise "Ihx8m Checksum ERROR\n"
	end

  end  # end of parse_line

  # 文字列形式でダンプする
  def to_s
	i = 0;	ret = ""
	length = @memory.length
	while(i < length)
	  ret += sprintf("%04x %04x\n", i, @memory[i]) if (@memory[i])
	  i = i+1
	end
	ret
  end

end  # end of Ihx8m

# ihx = Ihx8m.new
# ihx.parse('morse.hex')
# print ihx.to_s

-- 参考データ morse.hex

:020000001528C1
:100008009100030E92008D03031D0D2805308D000D
:100018008C03100885060B11120E8300910E110E29
:100028000900FF3085008316FC308500813081008F
:10003800831201308D009001A0308B008901831656
:10004800081483120808031922282C20890A232857
:100058008E000E090319442807308F008E1B37289D
:100068008F038E0D32288E0D8E1F4B208E1B49203C
:100078008E0D0F3051208F0B38281E30512008006C
:100088001E3051202D30512008002D304C280F30C3
:10009800101451201010051408008C008C1F5228D1
:0200A80008004E
:02400E00F23F7F
:1042000010000200140014000F00FF000B000F004C
:0A4210000A0014000C00FF0000007B
:00000001FF