Use perl 5.10: Given / when
The feature I’ll talk about here is the given/when construct, which was
added in perl 5.10. It works like switch/case in other programming
languages, but is much more powerful. The matching is based on smart matching,
which is another feature added in 5.10;
I will start with a simple example to give you an idea of the syntax that is used.
use 5.010;
my $x = <>;
chomp $x;
given ($x) {
when ([0..99]) {
say "Looking good";
}
when ([100..199]) {
say "That's a bit much";
}
default {
say "This could be a problem";
}
}
This code compare the value of $x with the array’s in the when statements.
If $x is between 0 and 99 (inclusive) it will the text Looking good. If it’s
between 100 and 199 then it will say That's a bit much. The default block
will be called when the value isn’t matched by the when blocks.
Next I will give a more useful example, but not much more.
use 5.010;
my ($x, $y) = (0,0);
LINE: while (<>) {
my @parts = split /\s+/;
for (@parts) {
when (/^x(\d+)/) {
$x = $1;
}
when (/^y(\d+)/) {
$y = $1;
}
when (/^p/) {
say $x + $y;
}
when (/^q/) {
last LINE;
}
}
}
This example reads lists of tokens from STDIN and matches them and executes code
based on the input. In effect it’s a small programming language. Notice that
this code doesn’t use the given statement. It’s not needed here, because the for
already assigns each element of @parts to $_.
It’s also possible to use simple expressions like you would use in an if statement.
For example:
use 5.010;
my $age = <>;
chomp $age;
given ($age) {
when (!/^\d+$/) {
say "Not a number";
}
when ($_ > 100) {
say "That's quite old";
}
when (18) {
say "Now your life begins...";
}
when (0) {
say "Just born, and already using the computer.";
}
default {
say "I have nothing useful to say about '$age'";
}
}
As you can see when is quite smart about what to do with different
expressions. The first when clause contains a negated regular expression.
This will be matched using $age !~ m/REGEX/. The second one do what you
expect. The 18 and 0 clauses will match using $age == 18 and $age == 0.
You should watch out with comparing to 0 because this will also match empty
strings or just strings. For example if $age = ‘hello’, when(0) will match.
Smartmatching is really powerful. With given and when it’s easy to use this
power for deciding what to do with the value that you’ve been given. You
should take a look at the manual for more information about the possible smart
matches and the things you can with given and when.