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

But using $h{x} will not add an undef value into $h{x}. It just returns an undef value since $h{x} doesn't exist. I still don't see what magic keys() is using to get around the syntax error message.

Replies are listed 'Best First'.
Re^5: Keys() required to autovivify?
by GrandFather (Saint) on Dec 30, 2007 at 20:31 UTC

    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
      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' => {} };