I just found out about Perl 5.10, which has been out for some time now (released on December 18 ... how did I miss this?). The perldelta documentation goes into detail on what's new, but here's a brief overview of some of the features I find most appealing:
The 'feature' pragma
First and foremost is the feature
pragma, which is used to turn on the new features added by 5.10. By default, the new features are disabled, and you explicitly have to request their support (a great idea, in my opinion). A simple use feature;
statement will do the trick.
New 'Defined-Or' operator
A new //
operator is now available, for handling the 'defined-or' case. For example:
$a // $b; # This is equivalent to the line below
defined $a : $a ? $b; # Same meaning as above
This new operator has the same precedence as the logical-or operator. In typical Perl fashion, the new operator is simply a shortcut that makes your scripts shorter and more difficult to read one month after you write it. ;)
Switch statements
At long last, Perl has a switch statement. The syntax here is quite different from other programming languages with which you might be familiar:
given ($state)
{
when ("state_1") { $a = 1; }
when (/^abcdef/) { $b = 2; }
default { $c = 0; }
}
The various when
tests allow for some powerful options, including: array slices, string compares, regular expression matches, and beyond.
Named captures in regular expressions
Suppose we want to read in a configuration file that contains lines with the following structure: option = value
. Today, we could write a regular expression to capture these values like this: /(\w+) = (\w+)/
. We would then access the captured values with $1
and $2
.
In Perl 5.10, we could write the same expression like this: /(<?option>\w+) = (<?value>\w+)/
. Now, the captured values are accessed through either the %+
or %-
magical hashes, using each label as the key into each hash (see the perldelta documentation for the differences between the two hashes). This will make complex regular expressions much easier to decipher, and gets rid of the annoying parenthesis counting that we currently have to do.
Just 'say' it
The new say
keyword is just like print
, but it automatically adds a newline at the end of what it prints. How great is that? This simplifies printing code a little bit, especially for loops. Instead of print "$_\n" for @items;
we can now use say for @items;
. Clean and simple!
Stackable file tests
Doing multiple file tests is much easier now. Instead of if (-f $file and -w $file and -z $file)
we can now write if (-f -w -z $file)
. Again, this makes things much cleaner.
Better error messages
Have you ever seen this error message? I know I have:
$str = "Hello $name! Today is $day and the time is $time.\n";
Use of uninitialized value in concatenation (.) or string at test.pl line 3.
In 5.10, this same error message will read:
$str = "Hello $name! Today is $day and the time is $time.\n";
Use of uninitialized value $time in
concatenation (.) or string at test.pl line 3.
Now I can know exactly where the error occurred! Finally!
And lots more
There are plenty of other new features that I haven't touched here: recursive regular expressions, a new smart matching operator, state ("static") variables, inside-out objects, and lots more. I'm really looking forward to trying out some of these new features.