Why does $a become an arrayref? I'm not pushing anything to it.
perl -MData::Dumper -e 'use strict; 1 for @$a; print Dumper $a'
$VAR1 = [];
It is because the for loop treats contents of @$a as lvalues--something that you can assign to. Remember that for aliases the contents of the array to $_. It appears that the act of looking for aliasable contents in @$a, is sufficient to cause autovivification, even when there are no contents to alias.
This effect of aliasing is consistent, too. The following also lead to autovivification:
map {stuff} @$a;grep {stuff} @$a;a_subroutine( @$a);If you want to manage autovivification, you can use the eponymous pragma to effect lexical controls.
When you treat a scalar variable whose value is undef as any sort of reference, Perl makes the value the reference type you tried to use. In this case, $a has the value undef, and when you use @$a, it has to autovivify an array reference in $a so you can dereference it as an array reference.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With