Search code examples
perlautovivification

Perl vivification question while dereferencing undefined array reference


I'm having tough time in understanding why the following works:

my $array_reference;
foreach $element (@{$array_reference}) {
# some code
}

while the following does not work

my $array_reference;
if (scalar (@{$array_reference}) {
    # some code here
}

I understand that perl brings to life (auto-vivifies) undefined reference. But I am still confused as in why the latter code segment throws FATAL.


Solution

  • Dereferences autovivify in lvalue context (meaning when a modifiable value is expected), and foreach create an lvalue context.

    >perl -E"$$x = 1;  say $x;"
    SCALAR(0x74b024)
    
    >perl -E"++$$x;  say $x;"
    SCALAR(0x2eb024)
    
    >perl -E"\$$x;  say $x;"
    SCALAR(0x30b024)
    
    >perl -E"sub {}->($$x);  say $x;"
    SCALAR(0x27b03c)
    
    >perl -E"for ($$x) {}  say $x;"
    SCALAR(0x25b03c)
    

    The last two create an lvalue context because they need a value to which to alias $_[0] and $_ (respectively).