in reply to Re^3: 5.24 -> 5.28 -- what has changed in autovivification?
in thread 5.24 -> 5.28 -- what has changed in autovivification?

#!/usr/bin/env perl use warnings; use strict; no autovivification qw{fetch store exists delete}; my $h = { a => { p => 2, q => 3 } }; print "perl ver $], autoviv ver $autovivification::VERSION:\n"; ! $$h{a}{x}{z} and print "a/x/z not\n"; __END__ perl ver 5.024004, autoviv ver 0.16: a/x/z not perl ver 5.028001, autoviv ver 0.16: a/x/z not perl ver 5.024004, autoviv ver 0.18: Can't vivify reference at a.pl line 9. perl ver 5.028001, autoviv ver 0.18: Can't vivify reference at a.pl line 9.

Replies are listed 'Best First'.
Re^5: 5.24 -> 5.28 -- what has changed in autovivification?
by leszekdubiel (Scribe) on Apr 18, 2020 at 20:45 UTC
      I understand that there are only two options

      In core Perl, yes (Update: actually, autovivification isn't even in the core). But choroba showed one possibility, and writing a single-purpose routine isn't difficult either (I've admittedly compacted it a bit):

      use warnings; use strict; sub dive { my $r = shift; $r = ref $r eq 'HASH' && exists $$r{$_} ? $$r{$_} : return for @_; return $r } use Test::More; my $h = { a => { b => { c => { d => 'e' } } } }; is dive($h, qw/ a /), $h->{a}; is dive($h, qw/ a b /), $h->{a}{b}; is dive($h, qw/ a b c /), $h->{a}{b}{c}; is dive($h, qw/ a b c d /), 'e'; is dive($h, qw/ a b c d e /), undef; is dive($h, qw/ a x /), undef; is dive($h, qw/ a b x /), undef; is dive($h, qw/ a x y /), undef; is dive($h, qw/ a b x y /), undef; is dive($h, qw/ x /), undef; is dive($h, qw/ x y /), undef; is dive($h, qw/ x y z /), undef; is_deeply $h, { a => { b => { c => { d => 'e' } } } }; done_testing;

      Update: Both of the links in your post appear to be broken. I assume you were trying to link to perl5280delta and RT#127712.

        Thank you for code and making links good.
      > This is not possible.

      You've been given a solution by haukex in Re: 5.24 -> 5.28 -- what has changed in autovivification?.

      Do you need more details? Here's an example:

      #! /usr/bin/perl use warnings; use strict; use feature qw{ say }; use Data::Diver qw{ Dive }; use Data::Dumper; my $h1 = {}; my $h2 = {a => {b => {c => 42}}}; for my $h ($h1, $h2) { say "Found $h->{a}{b}{c}" if Dive($h, qw( a b c )); } print Dumper $h1, $h2;
      Output:
      Found 42 $VAR1 = {}; $VAR2 = { 'a' => { 'b' => { 'c' => 42 } } };

      map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]