I have determined the cause of the problem. Here are more details to the calls made for the problem seen when
adding a new call in AA.pm to BB.pm.
AA.pm
use strict
use warning
sub Abug1 {}
sub Asub2 {
BB::Bsub1(1,2,3);
BB::Bsub2(hostname); # hostname is a "bareword"
}
sub Asub3 {}
Asub2() is only invoked at runtime via CGI::Applicaton run_modes(). The problem is that with "strict" enabled, barewords are not allowed as parameters to subroutine calls. Instead of reporting an error, the compilation is quietly aborted in the *next* subroutine when a single quote is found: resulting in all subsequent subroutines not being compiled. It also results in the program running for code that compiled and the offending subroutine working just fine. I could see that the other subroutines were missing in the debugger, I just couldn't figure out why. The key was running:
perl -MO=Terse AA.pm
It reports the offending line and where compilation is terminated. I'm glad I ignored the module description I found on perl.org: "This module is useful for people who are writing their own back end, or who are learning about the Perl internals. It's not useful to the average programmer."
I expect that this is an unusual case because:
1. The resolution of the function doesn't occur until the specific web page is selected and is done as a string lookup.
2. The invocation of the subroutine is protected in "eval { }" so the program keeps on running.
Thanks for the input and I hope this can help someone in the future. |