Use procs and make them recursive for extra fruitiness.

The Hash#delete_if method takes a proc and, if it returns true, the element will be deleted. Careful: this is a mutating method, operating on the original object and doesn't return a copy.

deep_clean = Proc.new do |k, v| 
v.delete_if(&deep_clean) if v.kind_of?(Hash)
k == :delete_me || v.nil? || v.empty?
end

hsh.delete_if(&deep_clean)

Tweak line 3 to get the outcome you need. Be careful of using the &s right when copying the above.