Timers in Perl

Our program demonstrates the use of timers in Perl. Timers allow us to execute code at some point in the future or repeatedly at some interval.

use strict;
use warnings;
use Time::HiRes qw(sleep);

# Timers represent a single event in the future. You
# tell the timer how long you want to wait, and it
# will execute a given code block after that time.
# This timer will wait 2 seconds.
my $timer1 = {
    seconds => 2,
    code => sub {
        print "Timer 1 fired\n";
    }
};

# We'll use sleep to simulate the timer firing
sleep($timer1->{seconds});
$timer1->{code}->();

# If you just wanted to wait, you could have used
# sleep directly. One reason a timer may be useful is
# that you can cancel the timer before it fires.
# Here's an example of that.
my $timer2 = {
    seconds => 1,
    code => sub {
        print "Timer 2 fired\n";
    }
};

my $timer2_thread = async {
    sleep($timer2->{seconds});
    $timer2->{code}->();
};

# Stop the timer
$timer2_thread->cancel();
print "Timer 2 stopped\n";

# Give the timer2 enough time to fire, if it ever
# was going to, to show it is in fact stopped.
sleep(2);

To run this program, save it as timers.pl and execute it with:

$ perl timers.pl
Timer 1 fired
Timer 2 stopped

The first timer will fire ~2s after we start the program, but the second should be stopped before it has a chance to fire.

Note that Perl doesn’t have built-in timer objects like Go does. Instead, we’ve simulated timers using hash references and the Time::HiRes module for high-resolution sleep. For the cancellable timer, we’ve used a simple threading model with the threads module. This is a basic approximation of Go’s timer functionality in Perl.

In a real-world scenario, you might want to use a more robust event loop or timer library, such as AnyEvent or POE, for more complex timer operations in Perl.

查看推荐产品

Comments powered by Disqus