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?