in reply to late binding behavior in hash definition

This is straightforward to predict when you separate what's happening on the right side from what's happening on the left.

The list of

(1 => 2, 3 => $x{1} )
Is identical to
(1, 2, 3, undef)
as long as %x didn't have a previous value.

In fact, it's the prior value of $x{1} that you see, as evidenced by:

%x{1} = "old x sub 1"; %x = ( 1 => 2, 3 => $x{1} );

The question for me is, why did you find this surprising or baffling? It's extremely consistent with what Perl does at all times: evaluate the right side of the assignment before altering any structure on the left. It's what permits

@a = (2, @a)
or
@a = reverse sort @a;
to work.

-- Randal L. Schwartz, Perl hacker