Wenn man wissen will, ob eine Methode in einer Klasse nur deklariert (sub method;) oder ob eben auch ein Methodenkörper existiert (sub method { die 1; }) sollte man sich nicht nur auf can() verlassen.
sub existing_sub;
sub defined sub { die 1; }
print __PACKAGE__->can('notexisting_sub'); #false
print exists(¬existing_sub); # false
print defined(¬existing_sub); # false
print __PACKAGE__->can('existing_sub'); #true
print exists(&existing_sub); # true
print defined(&existing_sub); # false
print __PACKAGE__->can('defined_sub'); #true
print exists(&defined_sub); # true
print defined(&defined_sub); # true
Der Aufruf einer Methode, die nur deklariert, führt zu einem „Undefined subroutine .. called“ fehler, den man ja eigentlich mit dem can() verhindern wollte. Mir ist noch nie eine solche, blanke Deklaration über den Weg gelaufen, aber man weiß ja nie.