Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re^2: Copy a builtin sub to a different name and then override

by bliako (Monsignor)
on Jun 01, 2018 at 23:18 UTC ( [id://1215694]=note: print w/replies, xml ) Need Help??


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

that worked!

#!/usr/bin/env perl use strict; use warnings; my $total_sleep_time = 0; BEGIN { *CORE::GLOBAL::sleep = sub(;@) { $total_sleep_time+=$_[0]; CORE::sleep +($_[0]) } } # use this module and the other # ... print "\$]=$] \$^V=$^V\n"; sleep(2); print "total sleep is $total_sleep_time\n";
$]=5.026002       $^V=v5.26.2
total sleep is 2
thanks

Replies are listed 'Best First'.
Re^3: Copy a builtin sub to a different name and then override
by pme (Monsignor) on Jun 02, 2018 at 09:23 UTC
    sleep sleeps integer seconds and returns the integer number of seconds actually slept.
    #!/usr/bin/perl use strict; use warnings; my $total_sleep_time = 0; BEGIN { *CORE::GLOBAL::sleep = sub(@) { $total_sleep_time += CORE::sleep($_[0]); } } print "\$]=$] \$^V=$^V\n"; sleep(2); sleep(1); sleep(1.3); print "total sleep is $total_sleep_time\n"; $ time -p ./sleep.pl $]=5.024001 $^V=v5.24.1 total sleep is 4 real 4.00 user 0.00 sys 0.00
      > returns the integer number of seconds actually slept.

      Excellent point, because any replacement has to mimic this behavior.

      Afaik all implementations shown so far are broken in this respect.

      (Yours too btw :)

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

        Excellent point, because any replacement has to mimic this behavior.

        That depends on scope. If I write my watchdog.pl program which runs on my system, I might want a sleep override which returns the number of green bubbles appearing in my room at night whilst being asleep (ghosts, bengal fires), or a tupel having [ $seconds_slept, @things_missed ] monitoring the chatterbox, or anything else.

        Things are different if I want to convince all perl programmers to use my sleep subroutine as a drop-in replacement for the builtin.

        Update: in the context of this thread, you are right of course (make all imported modules use the overriden sleep()), so this comment is rather pointless. Well, at least it carries an idea for yet another silly program.

        perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'
Re^3: Copy a builtin sub to a different name and then override
by morgon (Priest) on Jun 01, 2018 at 23:29 UTC
    Very nice.

    Overriding CORE::GLOBAL::sleep but calling CORE::sleep makes total sense when you see it (as it avoids the recursion).

    This is of course what Lanx has been trying to say all along :-)

      You seem to think you've counted coup here but bliako said LanX's final suggestion did in fact solve the issue even if the original suggestion wasn't on point because it jumped into the semantics of the sample code too literally. Pointless drama over silly beef just gets in the way of communication and solving problems.

        > even if the original suggestion wasn't on point

        Actually the first approach works and is saner if CORE::GLOBAL::sleep() already exists.

        If you can't be sure if someone else already overrode the builtin you should wrap around the wrapper (which might already wrap around another wrapper and so on).

        OK, granted: In the case of builtins that's a very wide interpretation of "sane", but this technique can be useful with any kind of wrapper (like $SIG{"__DIE__"} et al)

        The problem here is to know if a real sub-ref already "exists", and - surprise - exists does the trick

        use strict; use warnings; warn "Doesn't Exist!" unless exists &CORE::GLOBAL::sleep; *CORE::GLOBAL::sleep =sub {42}; warn "Exists!" if exists &CORE::GLOBAL::sleep;
        Doesn't Exist! at d:/Users/lanx/pm/core_sleep.pl line 4. Exists! at d:/Users/lanx/pm/core_sleep.pl line 6.

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

        update

        using defined is even "saner".

        see Re^3: Copy a builtin sub to a different name and then override

      Bla bla

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1215694]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (1)
As of 2024-04-24 15:36 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found