and here is the reason why, at least with 5.16
warn $];
warn \&CORE::GLOBAL::sleep;
warn \&CORE::sleep;
&CORE::GLOBAL::sleep(3);
5.016003 at d:/Users/lanx/pm/core_sleep.pl line 1.
CODE(0x328420) at d:/Users/lanx/pm/core_sleep.pl line 4.
CODE(0x349718) at d:/Users/lanx/pm/core_sleep.pl line 5. <-- differen
+t!
Undefined subroutine &CORE::GLOBAL::sleep called at d:/Users/lanx/pm/c
+ore_sleep.pl line 7.
You are trying to build a wrapper around an non-existent function.
You haven't told us which version you use, but I doubt that CORE::GLOBAL:: is populated by default.
What you originally tried, something like:
*old = *CORE::GLOBAL::sleep
is aliasing the two symbols (two symbols pointing to the same typeglob)
But after populating the code slot with *CORE::GLOBAL::sleep = sub{} both will point to the same sub.
*old = *CORE::GLOBAL::sleep;
*CORE::GLOBAL::sleep = sub { warn " **** beware of morons **** "};
&old(); # oops
warn \&CORE::GLOBAL::sleep;
warn \&old;
**** beware of morons **** at d:/Users/lanx/pm/core_sleep.pl line 2.
CODE(0x4c9478) at d:/Users/lanx/pm/core_sleep.pl line 7.
CODE(0x4c9478) at d:/Users/lanx/pm/core_sleep.pl line 8. <-- identical
+!
That's why you get a circular call!
update
same with 5.18 on linux
lanx@ubuntu14-large:~$ perl
warn $];
warn \&CORE::GLOBAL::sleep;
warn \&CORE::sleep;
&CORE::GLOBAL::sleep(3);
__END__
5.018002 at - line 1.
CODE(0x1804cb8) at - line 2.
CODE(0x1830398) at - line 3.
Undefined subroutine &CORE::GLOBAL::sleep called at - line 4.
lanx@ubuntu14-large:~$ perl
*old = *CORE::GLOBAL::sleep;
*CORE::GLOBAL::sleep = sub { warn " **** beware of morons **** "};
&old(); # oops
warn \&CORE::GLOBAL::sleep;
warn \&old;
__END__
**** beware of morons **** at - line 2.
CODE(0x2089448) at - line 5.
CODE(0x2089448) at - line 6.
|