in reply to Where does time come from? CORE::GLOBAL:time no honored.

The "obvious" cause would be that the Queue::MyS­QLQ::deque­ue code gets compiled before that first BEGIN block gets run. I suspect you have already considered that but my scan of the thread didn't find that point specifically addressed so I thought I'd mention it.

- tye        

  • Comment on Re: Where does time come from? CORE::GLOBAL:time no honored. (order)

Replies are listed 'Best First'.
Re^2: Where does time come from? CORE::GLOBAL:time no honored. (order)
by ikegami (Patriarch) on Mar 27, 2009 at 14:41 UTC
    Thanks, I did not know that.
    use strict; use warnings; print("Get time1\n"); my $time1 = time(); BEGIN { print("Override\n"); no warnings qw(redefine); *CORE::GLOBAL::time = sub { 4 }; } print("Get time2\n"); my $time2 = time(); print($time1, "\n"); print($time2, "\n");
    Override Get time1 Get time2 1238164958 4
Re^2: Where does time come from? CORE::GLOBAL:time no honored. (order)
by Anonymous Monk on Mar 27, 2009 at 14:08 UTC
    I think you're on to something. I didn't realize that redefining CORE::GLOBAL::time would have no effect on code already compiled that uses time(). Is there a resource I can read on how this works?

      I don't think so, but here's one:

      The items in perlfunc are actually operators. Overriding of these named operators is handled by the parser, not by the overridden operator. When the parser encounters a named operator such as time it normally places an invocation of the operator in the opcode tree.

      $ perl -MO=Concise,-exec -e'time()' 1 <0> enter 2 <;> nextstate(main 1 -e:1) v 3 <0> time[t1] v <-- time operator 4 <@> leave[1 ref] vKP/REFC -e syntax OK

      But when the operator has been overloaded, it places a subroutine invocation in the opcode tree instead.

      $ perl -MO=Concise,-exec -e'BEGIN { *CORE::GLOBAL::time = sub {} } tim +e()' 1 <0> enter 2 <;> nextstate(main 3 -e:1) v 3 <0> pushmark s 4 <#> gv[*CORE::GLOBAL::time] s <-- sub name 5 <1> entersub[t2] vKS/TARG,1 <-- sub invocation 6 <@> leave[1 ref] vKP/REFC -e syntax OK

      The same goes when overriding a named operator locally.

      $ perl -MO=Concise,-exec -e'use subs qw( time ); time()' 1 <0> enter 2 <;> nextstate(main 12 -e:1) v 3 <0> pushmark s 4 <#> gv[*time] s <-- sub name 5 <1> entersub[t2] vKS/TARG,1 <-- sub invocation 6 <@> leave[1 ref] vKP/REFC -e syntax OK

      Re^2: Where does time come from? CORE::GLOBAL:time no honored. (order) has an example.