再帰書いてたらStringとArrayに相互性が今ひとつないことに気付いたよ。
スタック越えない限りは実行可能なはず。

#!ruby
require('pp')

def rhash(a)
  case a.length
  when 0:
  when 1:
      {}
  when 2:
    {a[0] => a[1]}
  else
    {a[0] => rhash(a[1..-1])}
  end
end

hash = {}
DATA.each_line do |line|
  hash.merge!(rhash(line.split))
end

pp hash

__END__
a b c
d e f
g h i
j k l m n o p q r
s t u v w x y z A B C D E