安達@沖データと申します。

1.2.2のエラーメッセージの出力にバグっぽいのを見つけました。

次の二つのスクリプトを考えて見ます。

-[ test.rb ]----------------------------------------------------------------
#!/usr/local/bin/ruby

require 'tttest.rb';

tttest(<<END);
490000 64
420000 74
470000 0
770000 22
END
----------------------------------------------------------------------------

-[ tttest.rb ]--------------------------------------------------------------
#!/usr/local/bin/ruby

def tttest (lines)
  lines.each {
    | l |
    print $1.to_i/$2.to_i if (l =~ /([0-9]+)[^0-9]+([0-9]+)/);
  }
end
----------------------------------------------------------------------------

実行すると次のメッセージを出します。

-[ error-message ]----------------------------------------------------------
./tttest.rb:16:in `/': divided by 0 (ZeroDivisionError)
        from ./tttest.rb:16:in `tttest'
        from ./tttest.rb:14:in `each'
        from ./tttest.rb:14:in `tttest'
        from ./test.rb:5
----------------------------------------------------------------------------

エラー自体ではなく、問題はそこで表示されている行番号です。

最初の16行目というのは、おそらくtest.rbの3行目をtttest.rb全体で置き換
えて得られる行番号なのでしょう。でも、これは初心者にはわけがわからない
に違いありません。なぜなら、tttest.rbに16行目は存在しないからです。

また、私にもよくわからないのが、メッセージの3行目、4行目ででている'14'
行目という表示です。エラー発生場所から、除算の位置とイテレータ(each)の
場所の差分の2行戻っているだけですか?

#うーむ。みなさん、ヒアドキュメントって使わないのかな。やってみて思う
#んですが、ヒアドキュメントってデバッグしずらいですよね。全部メモリに
#読み込むのか、でかい奴だと普通に処理するよりかなり遅そうだし。
--
*------*				adachi / okidata.co.jp
|人∧鷲|				沖データ 第一研究所
| <女> |				安達 淳
|牛∨獅|
*------*