As it autovivifies, it's not "useless", strictly speaking..
By that logic, the following shouldn't warn since calling f() isn't useless:
$ 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.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.