So, what is a
continue block and why would you want to use one? I have a habit of writing mini-daemonoid (for real daemons look at
Proc::Daemon) scripts. Here is a trivial example:
#!/usr/bin/perl
use strict;
use warnings;
#wait to be killed by SIGTERM or a control-c
my $continue = 1;
local $SIG{INT} = local $SIG{TERM} = sub { $continue = 0 };
while ($continue) {
print "foo: ", time(), "\n";
sleep 1;
}
This works very well for most purposes, but it has a minor annoyance: if you say
next in the body of the loop, you create a tight loop that will consume 100% of a CPU. The problem here is that we would skip the
sleep statement that puts a break on the loop. That
sleep statement is not really part of the body of the loop. It something extra that we want to execute each time through the loop. And that is what a
continue block is: something that runs each time through the loop. For example, the following code prints
"Hello World\n" five times despite the fact that the
next statement skips to the next iteration:
#!/usr/bin/perl
use strict;
use warnings;
for (1 .. 5) {
print "Hello ";
next;
print "beautiful ";
} continue {
print "World\n";
}
This means we can use the
continue block to solve the problem:
#!/usr/bin/perl
use strict;
use warnings;
#wait to be killed by SIGTERM or a control-c
my $continue = 1;
local $SIG{INT} = local $SIG{TERM} = sub { $continue = 0 };
while ($continue) {
print "foo: ", time(), "\n";
} continue {
sleep 1;
}
Even though we don't need it now, it is good practice to identify the portions of your loop that should always run, and move them into
continue blocks. This servers as a hedge against some future enhancement that might want to use
next and it is a useful clue to some later maintainer that the code is important.
No comments:
Post a Comment
Some limited HTML markup is allowed by blogger: strong, b, i, and a. You may also use em, but I have repurposed it through the magic of CSS to be behave very much like <tt><code></code></tt>.