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 = [];
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 = [];
$a
becomes an ARRAY reference due to Perl's autovivification feature.It is because the
for
loop treats contents of@$a
as lvalues--something that you can assign to. Remember thatfor
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.$a and $b are special variables in Perl (used in sort) and have a special scope of their own.
produces