By that logic, the following shouldn't warn since calling f() isn't useless:As it autovivifies, it's not "useless", strictly speaking..
$ 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.
In reply to Re^3: Possible useless use of map
by ikegami
in thread Possible useless use of map
by andreas1234567
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |