Many people have asked this this question and many have gotten the same useless answers. It is true that subs can be defined on the fly and that can be made hard to check things at compile time. HOWEVER, variables can also be made on the fly, so it seems like a stupid argument, because 'use strict' can enforce that variables be declared somewhere.
The place where there is really a problem is with method calls, because you can not always know what type of object something is at compile time. For example:
sub foo {
my $thing = shift;
$thing->bar();
}
Here "$thing" could be any type of object, so it is impossible for the compiler to know what package to check for the existance of the method.