Ok, since that whole sub vs. gsub thing seems to have simmered down, I noticed
we have:
String#tr - translates search to replace, if search[0] == ?^ then translate
not in search to replace
String#tr_s - do the same thing except squeeze the string, same logic for ^
Wouldn't this make more sense as
String#tr(search, replace [, flags]) where flags can be COMPLEMENT and SQUEEZE