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?

Reply via email to