![]() |
|
Just another Perl shrine | |
PerlMonks |
Re^3: use and require inside subsby Ytrew (Pilgrim) |
on Nov 03, 2004 at 04:15 UTC ( #404812=note: print w/replies, xml ) | Need Help?? |
I thought I knew this, but why do I put my use statements inside if/then if it happens at compile time?
As Tachyon points out, you shouldn't. Or at least, run-time statements won't get executed at compile time, so your code won't do what you want. Remember, the use() command has an implicit BEGIN block around it, which forces the statements to be executed at compile time. The statement: use module; is like writing:
So, you have two choices. You can make all the decisions about which code to include at run-time, and use "require" statements. As ysth points out, something like the following doesn't actually work, though I initially thought it did.
Since BEGIN blocks and use statements both now happen at "compile time", the above code should work, right? Nope. There's a specifically defined order to how BEGIN blocks execute, and it's not what I had assumed it was. Upon a careful reading of the perl module documentation page, (type "perldoc perlmod" to read it), I think I understand how it all works. Comments and corrections are appreciated. According to the documentation: A "BEGIN" code block is executed as soon as possible, that is, the moment it is completely defined. The documentation doesn't say exactly what "completely defined" means, but I took it to mean when the end of the BEGIN block is reached, when reading sequentially through the code. This implies that code like this: should print "-three-two-one", because the end of the block that prints "-three-" is encountered first, then "-two-", then "-one-". This is what happens when I run it, which implies I'm at least close to right. It also means that when you write a BEGIN block with a "use" statement inside it, the end of the use statement gets reached before the end of the BEGIN block. Since a use statment is really an implied BEGIN block, this means it executes first, before the BEGIN block gets a chance to do anything.
Sorry for any confusion I caused. :-(
--
In Section
Seekers of Perl Wisdom
|
|