And this seems conceptually easier and it's slightly faster(if I 
benchmarked it correctly):

input = gets
h = Hash.new(0)

input.scan(/[a-z]/){|char| h[char] += 1}
p h.sort


============

require "benchmark"

input = "123Hello+#"

h = Hash.new(0)
Benchmark.bm(20) do |br|
    br.report("scan with block:") do
        200_000.times do
            input.downcase.scan(/[a-z]/){|char| h[char] += 1}
        end
    end
end

p h.sort
puts

h = Hash.new(0)
Benchmark.bm(20) do |br|
    br.report("scan with inject:") do
        200_000.times do
            input.downcase.scan(/[a-z]/).inject(h) do |h, c|
                h[c] += 1
                h
            end
        end
    end
end

p h.sort

--output:--

                          user     system      total        real
scan with block:      2.690000   0.010000   2.700000 (  2.714077)
[["e", 200000], ["h", 200000], ["l", 400000], ["o", 200000]]

                          user     system      total        real
scan with inject:     2.830000   0.020000   2.850000 (  2.856019)
[["e", 200000], ["h", 200000], ["l", 400000], ["o", 200000]]
-- 
Posted via http://www.ruby-forum.com/.