Why does Perl autovivify in this case?

前端 未结 4 1195
清酒与你
清酒与你 2020-12-10 19:45

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 = [];
<         


        
相关标签:
4条回答
  • 2020-12-10 20:25

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

    0 讨论(0)
  • 2020-12-10 20:34

    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.

    0 讨论(0)
  • 2020-12-10 20:34

    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.

    0 讨论(0)
  • 2020-12-10 20:39

    $a and $b are special variables in Perl (used in sort) and have a special scope of their own.

    perl -MData::Dumper -e 'use strict; 1 for @$c; print Dumper $c'
    

    produces

    Global symbol "$c" requires explicit package name at -e line 1.
    Global symbol "$c" requires explicit package name at -e line 1.
    Execution of -e aborted due to compilation errors.
    
    0 讨论(0)
提交回复
热议问题