in reply to Weird ? behavior of printf / sprintf

The "weird behavior" you observe has nothing to do with sprintf, it's just interpolation in double-quoted strings.

Seeing "$a[%d]", the interpolation rules require that $a[...] interpolates an element of @a in the string. That means that the part inside [...] is interpreted as Perl code, not as part of the string. Thus %d is evaluated as an undeclared hash in scalar context (it can because you are running without strict), which is 0. The result is the same as "$a[0]", which is "1".

For similar reasons, "$a[%2d]" is a syntax error.

In "\$a[%d]" the dollar sigil is escaped, so the part in [...] is a plain string and the result is $a[%d].

If something is weird about the behavior, it's string interpolation itself. Mainly your example serves as an object lesson on the importance of strictures.

Anno