views:

158

answers:

3

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: 

$a becomes an ARRAY reference due to Perl's autovivification feature.

Alan Haggai Alavi
+4  A: 

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.

brian d foy
Ok, here's another example: perl -MData::Dumper -e 'use strict; @$a;'Can't use an undefined value as an ARRAY reference at -e line 1.
eugene y
Perl doesn't autovivify in that case. There's no one rule when it will kick in, but usually autovivify happens when you want to do something with the variable. There's no operation there.
brian d foy
+4  A: 

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.

daotoad
+1 for proper use of "effect."
Chris Lutz
Effective use of 'effect' and 'affect' is an effect of my affect.
daotoad