When you call it with the argument list, it looks like a sub call, not a bareword and it decides that you must know what you are doing. The compiler isn't smart enough to know whether that sub will exist when that line executes. (You could eval it into existence, for example.) When you call it without the argument list, it just looks like a bareword and it doesn't assume that the bareword is actually a subroutine invocation because there is no real reason to make that assumption.
-sauoq
"My two cents aren't worth a dime.";