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
| [reply] [d/l] |
> 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 :)
| [reply] |
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'
| [reply] [d/l] [select] |
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 :-)
| [reply] |
| [reply] |
> 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.
update
using defined is even "saner".
see Re^3: Copy a builtin sub to a different name and then override | [reply] [d/l] [select] |