原です。

In [ruby-list:36517] Re: merge large files
  Tanaka Akira writes:

>まじめに読んでなかったんですが、map_with_index を使って、
>
>format = (["%-35s"] * ARGV.size).join(" | ")
>handles = ARGV.map{|f| open(f)}
>while (lines = handles.map_with_index {|h, i| h and (h.gets or handles[i] = h.>close)}).find{|x| x}
>  print format % lines.collect{|l| l.to_s.chomp}, "\n"
>end
>
>とか?

うむむ、今話題の(?)map_with_index ですね。元の配列を変形するのは気
づかなかったな。

----^ merge4.rb
format = (["%-35s"] * ARGV.size).join(" | ")
handles = ARGV.map{|f| open(f)}
while handles.find{|x| x}
  puts format % handles.map_with_index{|h, i| (h and (h.gets or handles[i] = h.close)).to_s.chomp}
end
----$ merge4.rb

の方が若干ローコストかな。あるいはフラグの配列を別に取るか、、、

-----^ merge5.rb
format = (["%-35s"] * ARGV.size).join(" | ")
handles = ARGV.map{|f| open(f)}
sa = (0...ARGV.size).to_a
while sa.find{|x| x}
  puts format % sa.map{|s| (s and (handles[s].gets or sa[s] = handles[s].close)).to_s.chomp }
end
-----$ merge5.rb

>この場合、なんで map じゃなくて map_with_index が必要かというと、要素
>を変更する必要があるからで、これは perl の foreach の VAR が代入可能で
>あるとか、Iteration Abstraction in Sather で CLU の問題として指摘され
>ている 3つのうちの No way to modify elements にあたるとか、けっこう一
>般的な話で... などと知ったばかりの蘊蓄を垂れてみたりして。

あ、なるほど。何となくわかります。