Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid

Re^3: BEGIN and compile-time

by ikegami (Pope)
on Nov 02, 2006 at 16:50 UTC ( #581922=note: print w/replies, xml ) Need Help??

in reply to Re^2: BEGIN and compile-time
in thread BEGIN and compile-time

but the more correct way is to think of run-time and compile-time as a per-block thing.

Quite so, ++ (Per-statement, even, in the case of use.)

print("first"); BEGIN { delete $INC{''}; use lib '../'; use ModX; } print("last");

gets executed in the following order

use lib '../'; # Before "delete" because of "use" use ModX; # Before "delete" because of "use" delete $INC{''}; # Before "first" because of "BEGIN" print("first"); print("last");

In detail:

  1. Compile print("first");.
  2. Compile BEGIN { ... }.
    1. Compile delete $INC{''};.
    2. Compile use lib '../';.
    3. Execute use lib '../';.
    4. Compile use ModX;.
    5. Execute use ModX;.
  3. Execute BEGIN { ... }.
    1. Execute delete $INC{''};.
  4. Compile print("last");.
  5. "Run phase" starts.
  6. Execute print("first");.
  7. Execute print("last");.

Replies are listed 'Best First'.
Re^4: BEGIN and compile-time (per statement)
by tye (Sage) on Nov 02, 2006 at 17:25 UTC
    but the more correct way is to think of run-time and compile-time as a per-block thing.
    (Per-statement, even, in the case of use.)

    More than just in the case of use. Certainly "my" statements have separate compile-time and run-time effects. "sub" declarations also have a compile-time impact as do "package" statements (as demonstrated in Object lesson). There may be others as well that just don't spring immediately to my mind.

    See Re^5: What is the scope of BEGIN? Or... when does it "begin?" (steps). Each statement has one "compile time" and zero or more "run times". I never talk about the one "compile time" or the one "run time" as that makes no sense to me. I'd not say '"Run phase" starts', for example.

    There is behavior that is triggered between when the main script source code has finished being compiled and the resulting non-sub code begins to be run. (Since I've never found a need to use CHECK / INIT blocks, I've never bothered to figure out and internalize how they are really scheduled, however.) But it makes no sense to me to say "CHECK code blocks are run [...] before run time begins" when lots of code has already seen its "run time" (and been run) before that.

    - tye        

      I'd not say '"Run phase" starts', for example.

      Notice the quotes. I included it to show how meaningless/misleading the term is, showing stuff being run before this so-called "runtime" phase. Thanks for the clarification.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://581922]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (12)
As of 2017-02-28 13:10 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (400 votes). Check out past polls.