I am expecting after the assignment in the second line, the array should consists of four elements #0-3
Why would you expect that? $array
is the only element you've assigned a value to, or even mentioned
, prior to the loop, so there's no reason for Perl to have allocated storage space for any other elements.
What you have missed is that Perl arrays are
sparse data structures, so that you can designed to allow you to assign to $array without consuming an unreasonable amount of memory to store the 8675309 unused elements which precede it. They are explicitly not C-style indexes into a region of contiguous memory.
(Also, as previous replies have mentioned, the docs warn against using exists on arrays, so this behavior should be considered implementation-dependent and other versions of the perl binary may potentially behave differently. I kind of doubt that they actually would behave differently in this case, but you still shouldn't rely on it in any code that you care about.)