Or am I misunderstanding how that mechanism works?
You are. Any module that gets used, will be loaded at compile time, thus, when your module is loaded. So there's no use in putting a use statement inside a method.
Sometimes, when some modules are only needed in exceptional circumstances, people can use a require statement in a method or sub, for example to load Carp in an error trapping routine.
You have to be aware of the differences between use and require: require doesn't call import in the loaded modules, and it won't change the allowable syntax for your code either. Thus, subs defined in that module won't be easily recognized as such in the loading script. It's something to look out for.
For OO modules, it makes no difference, whether you choose use or require.
| [reply] |
use SelfLoader;
sub __PACKAGE__::myfunc;
1;
__DATA__
sub myfunc {
use ThisOtherModule;
}
| [reply] [d/l] |
| [reply] |
yes -- use causes everything to be loaded at the beginning.. if you want it conditionaly loaded, one way is to do require Foo::Bar instead. (Also see my other reply below)
Update: See Also:
| [reply] [d/l] [select] |
Great, thanks for the clarification! I'll switch to one of those other styles (either doing all the "use" statements at the head of the file, or using require instead).
| [reply] |
You're misunderstanding. use happens at compile time. Consider:
#file: /perl/site/lib/Foo.pm
package Foo;
use strict;
use warnings;
sub bar
{
return "BAR";
}
1;
#file: test.pl
use strict;
use warnings;
my $i = 0;
if ( $i )
{
use Foo;
}
print Foo::bar; #prints "BAR"
| [reply] [d/l] [select] |