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

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}