$ perl -c -we'f()+123'
Useless use of addition (+) in void context at -e line 1.
-e syntax OK
You're mistaken about what gives the warning. The op that does the autovivification is not the one issuing the warning. It's the access of the foo element that issues the warning, and it's indeed useless to access the foo element.
$ perl -we'my $hr; $hr->{stuff}{foo}'
Useless use of hash element in void context at -e line 1.
is basically equivalent to
$ perl -we'my $hr; $_ = \%{ $hr }; $_ = \%{ $_->{stuff} }; $_->{foo};'
Useless use of hash element in void context at -e line 1.
The last bit is clearly useless.
If you prefer a diagram,
___________________ scalar context pad fetch. autovivifies
/ ________________ deref
| / ____________ scalar context hash fetch. autovivifies
| | / _______ deref
| | | / ____ void context hash fetch. warns.
| | | | /
|--|-|------|-|----|
$hr->{stuff}->{foo};
Similar, without useless bits:
$hr->{stuff} //= {};
Also, what about (intended) side effects with tied hashes?
Warnings aren't always accurate. That's why you can turn them off.
Update: Additions for the sake of clarity.
|