in reply to Re^3: Copy a builtin sub to a different name and then override
in thread Copy a builtin sub to a different name and then override

No that's fine, your later suggestion CORE::sleep() worked great! thanks

Replies are listed 'Best First'.
Re^5: Copy a builtin sub to a different name and then override
by LanX (Saint) on Jun 02, 2018 at 00:19 UTC
    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!

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery

    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.
    A reply falls below the community's threshold of quality. You may see it by logging in.