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

A hash can't have a key without a value (that's why I refer to key/value pairs). If you reference $h{x} in some fashion (except as a target for exists) then a x/undef pair is created (autovivified) for %h if it didn't exist already. The undef returned by $h{x} is the value associated with the key 'x'.

"Adding" an undef value to %h when $h{x} is used is exactly what autovivification does.


Perl is environmentally friendly - it saves trees

Replies are listed 'Best First'.
Re^6: Keys() required to autovivify?
by jrw (Monk) on Dec 30, 2007 at 23:59 UTC
    Autovivification (in the case of a hash) is when a key is added to a hash where previously that key wasn't there. Just using $h{x}, as in $val = $h{x} does not add a new key to the hash. It simply assigns the default undef value to $val. Referencing through a key does autovivify the all but the last key:
    #!/usr/bin/perl my %h; my $val = $h{x}{y}; use Data::Dumper; print Dumper \%h;
    Output:
    $VAR1 = { 'x' => {} };
    Apparently, not only does $h{x} not autovivify $h{x}, but even %{$h{x}} does not autovivify $h{x} (you have to turn off strict and -w first):
    #!/usr/bin/perl my %h; %{$h{x}}; use Data::Dumper; print Dumper \%h;
    Output:
    $VAR1 = {};
    But, using keys() causes %{$h[x}} to autovivify $h{x}.
    #!/usr/bin/perl -w use strict; my %h; keys %{$h{x}}; use Data::Dumper; print Dumper \%h;
    Output:
    $VAR1 = { 'x' => {} };