岩月と申します。

6行目の時点では ofp は定義されていないため、
例外が発生します。ですので、たとえば ofile = ""
の次の行にでも ofp = nil と書いておきましょう。

ofile = ""
ofp = nil
alist.each{|file|
(以下略)

今回の問題を再現するために別のコードを書きました。

flag = false
2.times do |count|
  p(count, local_variables)
  flag && p(ivar) # 2周目に例外が発生する
  ivar = 123
  flag = true
end

処理の流れだけを見ると、一回目のループの中で ivar = 123 が
あるから、二回目のループの p(ivar) は動きそうな気もしますが、
実際には同様の例外が発生します。

0
["flag", "ivar", "count"]
1
["flag", "ivar", "count"]
ivar_scope.rb:4: undefined local variable or method `ivar' for
main:Object (NameError)
        from ivar_scope.rb:2

ちゃんと調べたわけではないので自信ありませんが、
1周目の最後で ivar = 123 として定義されたローカル変数が、
2周目の冒頭では無かったことにされているんじゃないかなあと
予想してます。つまり

# まだ ivar は存在しない
ivar = 123
# ivar はあるよ

という感じではないかと。

ただ、local_variables でローカル変数を見ると ivar = 123 より以前でも
ivar があるようにも見えます。この辺はちゃんと理解していないので
わかりません。

-- 
IWATSUKI Hiroyuki <URL:mailto:don / na.rim.or.jp>