in reply to Weird ? behavior of printf / sprintf

If $var in a double-quoted string is replaced by the value of $var, then I would fully expect %hash in a double-quoted string to be replaced by the value of %hash. These results, then, are exactly as I would expect.

To do otherwise would be inconsistent.

To do otherwise, but only in the specific case of sprintf format strings (or other contexts where $, @, or % have special meanings), is to enter a morass of special-case rules which will surely lead to madness.