in reply to Understanding order of module compilation and execution

They are executed in order of appearance, with the additional requirement that modules that are 'used' appear when the compiler passes by, and modules that are 'required' appear during run time.

So, if the script has "use A;" before "use B;", the compiler will complile "A" first (and during that compilation, it will compile any 'used' modules in A), then, when it has compiled A, it will compile B.

If 2 modules have dependencies on each other an they both do some initialization before defining subs, how can your guarantee which order the initialization code is run in?
It would be a lot easier if you don't have circular dependencies. One day, you, or someone coming after you, will change the code that requires A to be compiled before B, while at the same time, it requires B to be compiled before A.

Anyway, you will have to use BEGIN and INIT blocks, remembering that 'use' is a BEGIN block as well. BEGIN blocks are executed as soon as they are compiled. INIT blocks are run before the main program starts, and they are run in the order they are compiled in.

Perl --((8:>*
  • Comment on Re: Understanding order of module compilation and execution

Replies are listed 'Best First'.
Re^2: Understanding order of module compilation and execution
by ikegami (Patriarch) on Dec 16, 2005 at 17:13 UTC
    So, if the script has "use A;" before "use B;", the compiler will complile "A" first (and during that compilation, it will compile any 'used' modules in A), then, when it has compiled A, it will compile B.

    Not quite. The compiler may *start* compliling "A" first, but it will not necessary compile all of "A" first. Even without using circular references.

    # main.pl use ModA; use ModB; # prints B A 1;
    # ModA.pm package ModA; use ModB; print("A\n"); 1;
    # ModB.pm package ModB; print("B\n"); 1;
      The compiler may *start* compliling "A" first, but it will not necessary compile all of "A" first.
      What do you think my and during that compilation, it will compile any 'used' modules in A means?
      Perl --((8:>*
        I missed that somehow, or misinterpreted it. It's definitely does not specify at which point during the compilation of 'A' those modules are compiled, so take my post as clarification.