Lemme re-comment this for you:
use strict;
sub This::Does::Not::Fail { };
# Rightly so because you've already notified Perl that
# this is a subroutine name. It *knows* this identifier
# is a sub. Thanks for pre-declaring it!
This::Does::Not::Fail; # rightly so
# This fails because you've given perl no contextual hints
# that this is a subroutine. It might be... a filehandle!
# Or something else. But you haven't pre-declared it
# either. This is a bareword (an identifier).
This::Will::Fail; # as we expect
# You haven't pre-declared this thing.
# *BUT* you did give perl a contextual hint that this is
# indeed a subroutine. This is essentially a *promise*
# you've made to strict that at runtime, when this code is
# encountered, you'll have a subroutine with this name
# all ready to go.
It::Bothers::Me::That::This::Works (); # wassup with THAT?!
For that last point, there are other "promises" you can make and not just with parens. Some of these include:
$obj->method; # Either $obj class' method will exist or
# AUTOLOAD had better take care of it later.
$a=foo Bar; # Bar will have a foo()! Or AUTOLOAD...etc.
&foo; # Again, you've promised it will exist...