in reply to No autovivification, for loop aliasing, lvalue vs rvalue in for loops

no autovivification;

is short for

no autovivification qw( fetch exists delete );

However, the list values of the foreach loop is evaluated in lvalue context so the loop body can alter (store values into) the resulting variables.

$_ = uc($_) for @a;

As such, you need

no autovivification qw( fetch exists delete store );
$ perl -e' use Data::Dumper; { no autovivification qw( fetch exists delete ); my $h; for (@{ $h->{k} }) { } print(Dumper($h)); } { no autovivification qw( fetch exists delete store ); my $h; for (@{ $h->{k} }) { } print(Dumper($h)); } ' $VAR1 = { 'k' => [] }; Can't vivify reference at a.pl line 14.