in reply to Re^5: Keys() required to autovivify?
in thread Keys() required to autovivify?

To me it looks like I'm explictly dereferencing (or casting) undef in both cases. Don't you interpret %{VAL} as an explicit dereferencing of VAL?

Replies are listed 'Best First'.
Re^7: Keys() required to autovivify?
by shmem (Chancellor) on Dec 31, 2007 at 12:43 UTC
    Of course %{VAL} is an explicit dereferencing of VAL. But assignment to a previously undefined hash reference is not.

    My previous example can be thought of and written as (and is in fact)

    use strict; my $f; ($f = {})->{foo} = 'bar'; my %new; %new = %{undef()}; # not okay

    I hope that clarifies things. Read perlref - the chapter about symbolic references. By saying %{''} you are creating a symbolic reference to the symbol table entry *{''}. Typeglobs can be empty strings, but not undef, so you cannot create a symbol reference to an undef value:

    $\ = $/; $h = ''; ${''}{foo} = 'bar'; print "\$h->{foo}: ", $h->{foo}; print "\$h: '", $h, "'"; print *{''}{HASH}; print *{$h}{HASH}; $h = undef; print *{$h}{HASH}; __END__ $h->{foo}: bar $h: '' HASH(0x885d7a4) HASH(0x885d7a4) Can't use an undefined value as a symbol reference at - line 11.

    The construct %{$h} being a symbolic reference:

    ${''}{foo} = 'bar'; $h = ''; %new = %{$h}; print "$_ => $new{$_}\n" for keys %new; __END__ foo => bar

    --shmem

    _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                  /\_¯/(q    /
    ----------------------------  \__(m.====·.(_("always off the crowd"))."·
    ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}