Michael G Schwern <[EMAIL PROTECTED]> writes:
> On Sun, Jan 13, 2002 at 10:04:58PM +0100, Mattia Barbon wrote:
>> > $ bleadperl -MO=-qq,Deparse foo.plx
>> > sub BEGIN {
>> > print "foo\n";
>> > }
>> > print "bar\n";
>> >
>> > If B::Deparse can save BEGIN blocks, B::C can.
>>
>> I didn't mean that I can't write code to make B::C save BEGIN blocks
>> ( it'd require <10 lines, probably ), I did mean that doing so would
>> not be a god idea: _I am
>> saving the state of the program after those blocks were ran_ and
>> they will be run _another time_ at runtime, and this is not correct:
>> ( for example use lib 'a'; would put 'a' into @INC twice, once
>> ( correctly ) at compile time, and another time ( incorrectly ) at
>> runtime ). In this
>> case this is not harmful, but you get the idea.
>
> I don't understand. The compiled program should do exactly what the
> original program did. Anything else, as difficult as it may be, is a
> bug. Lots of programs and modules do important load-time checks and
> logic inside BEGIN blocks.
>
> Why would this:
>
> BEGIN {
> push @INC, 'foo';
> }
>
> put 'foo' into @INC twice if it were compiled? The compiled program
> should not be storing the post-BEGIN value of @INC, it should store
> the original value at startup.
Um... You're wrong. If you do need 'startup time' initialization then
you should do it in an INIT block. If I may quote from the
documentation:
Once a "BEGIN" has run, it is immediately unde�
fined and any code it used is returned to Perl's memory
pool. This means you can't ever explicitly call a
"BEGIN".
So, by the time that the compiler comes to generate its output, the
BEGIN block as vanished, never to be seen again, which is as it should
be.
--
Piers
"It is a truth universally acknowledged that a language in
possession of a rich syntax must be in need of a rewrite."
-- Jane Austen?