Update: My apologies! Forget what I have said, it was my observation was off, not yours. But it might be a better idea to demo your issue by using Data::Dumper.
use Data::Dumper;
use strict;
use warnings;
my %foo = ( BAZ => 1 );
sub see_args { };
print Dumper(\%foo);
see_args( @foo{qw(BAR BAZ)} );
print Dumper(\%foo);
It prints:
$VAR1 = {
'BAZ' => 1
};
$VAR1 = {
'BAZ' => 1,
'BAR' => undef
};
Yes, autovivification is in working.
Your observation was off. In your original post, you were confused by the fact that the $ENV{TMPDIR} "appears" to have a value as you saw it through that sprintf. No, you didn't see the value of $ENV{TMPDIR}. Your sprintf printed a constant "<absent>", not the value of $ENV{TMPDIR}.</strick>