http://qs321.pair.com?node_id=500153


in reply to Re: Autovivification sucking the life out of me
in thread Autovivification sucking the life out of me

But I am not explicitly telling Perl to autovivify, rather I am (intending to) just reference the values, in this case using a slice.

Refer to my simpler example above. Using see_args( @foo{qw(BAR BAZ)} ); causes result:

at start: BAR '<absent>' at end: BAR '<undef>'
But changing that to see_args( $foo{BAR}, $foo{BAZ} ); results in:
at start: BAR '<absent>' at end: BAR '<absent>'
This is most perplexing to me.

Replies are listed 'Best First'.
Re^3: Autovivification sucking the life out of me
by Skeeve (Parson) on Oct 14, 2005 at 08:17 UTC

    Tell you what: It's perplexing to me the other way around!

    Until 2 days ago I thought something like
    if ($foo{'BAR'}) ...
    would already vivify that hash entry.

    But then I learned in the Chatter Box that it doesn't in perl 5.8 (or maybe a bit earlier).

    And now I did a test. Compare the output

    use Data::Dumper; %foo=(BAZ=>1); print Dumper \%foo if $foo{BAR} || 1; print Dumper \%foo if @foo{BAR,BAZ} || 1;
    Output:

    $VAR1 = {
              'BAZ' => 1
            };
    $VAR1 = {
              'BAZ' => 1
            };

    use Data::Dumper; %foo=(BAZ=>1); print Dumper \%foo if call($foo{BAR}); print Dumper \%foo if call(@foo{BAR,BAZ}); sub call { return 1 }
    Output:

    $VAR1 = {
              'BAZ' => 1
            };
    $VAR1 = {
              'BAR' => undef,
              'BAZ' => 1
            };

    So it's really the fact that the slice is used in a subroutine call. When you replace call with print, autovivification does not happen

    So now I ask myself: Is there a bug and you are certified bugfinder!? ;-)


    s$$([},&%#}/&/]+}%&{})*;#$&&s&&$^X.($'^"%]=\&(|?*{%
    +.+=%;.#_}\&"^"-+%*).}%:##%}={~=~:.")&e&&s""`$''`"e