in reply to Re: Where does time come from? CORE::GLOBAL:time no honored. (order)
in thread Where does time come from? CORE::GLOBAL:time no honored.

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?
  • Comment on Re^2: Where does time come from? CORE::GLOBAL:time no honored. (order)

Replies are listed 'Best First'.
Re^3: Where does time come from? CORE::GLOBAL:time no honored. (order)
by ikegami (Patriarch) on Mar 27, 2009 at 14:52 UTC

    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.