I just found out that Effective Perl Programming is available in digital formats through eBooks.com. They have a PDF version and an ePub version, each for $US31.99, which, sadly, is more than the hard-copy price of $US26.39 on Amazon.com and the Kindle price of $US17.59. Continue reading “Effective Perl Programming is in PDF and ePub”
Author: brian d foy
Watch out for side effects with `use VERSION`
Item 83: Limit your distributions to the right platforms mentioned that use
might invoke side effects. We didn’t get into the details in that Item though. As of Perl 5.10, use
imports some feature that you might not want.
Merely specifying a Perl version prior to 5.10 does nothing other than check the version you specify against the interpreter version. If the version you specify is equal to or greater than the interpreter version, your program continues. If not, it dies:
use 5.008; # needs perl5.008000 or later
This works with require too:
require 5.008; # needs perl5.008000 or later
However, use
is a compile-time function and require
is a run-time function. By the time you hit that require
, perl
has already compiled your program up to that point or died trying as it ran into unknown features. Code may have already run, despite using an inappropriate version of perl
. You want to impose your version restriction as soon as possible, so use
is more appropriate since it happens earlier.
You might think that you can fix this with a BEGIN
block which compiles and immediately runs the code so you get the ordering right. This gets the version check at compile time even though it’s a runtime statement:
BEGIN { require v5.10; }
In early versions of v5.10, this still imported new features, but this bug has been fixed. See BEGIN {require 5.011} imports features.
You should use at least v5.10.1 because it fixes various issues with smart match. That version doesn’t automatically import the new features if you use require
. Either of these specify that version:
use v5.10.1; BEGIN { require v5.10.1; }
use 5.010
With Perl 5.10, you get three side effects with use v5.10
. Starting with that version, use
-ing the version also pulls in the new features for that version. Obstensibly, that keeps programs designed for earlier versions breaking as newer perl
s add keywords, but it also tries to enforce the current philosophy of good programming on you.
Perl 5.10 introduces say
, state
, and given-which
, which you import implicitly when you say use v5.10.1
:
use v5.10.1; say 'I can use Switch!'; # imported say() given ($ARGV[0]) { # imported given() when( defined ) { some_sub() } }; sub some_sub { state $n = 0; # imported state() say "$n: got a defined argument"; }
If you want to insist on v5.10 without its new features, perhaps because your code uses some of the same keywords already, you can unimport the side effects immediately with the new feature pragma:
use v5.10.1; # implicit imports no feature; # take it right back again # you're own version of say() sub say { # something that you want to do }
If you only want some of the new features, you can unimport the ones that you don’t want:
use v5.10.1; no feature qw(say); # leaves state() and given() sub say { # something that you want to do }
use 5.012
Perl 5.12 includes two more side effects for use VERSION
. The unicode_strings
feature treats all strings outside of bytes
and locale
scopes as Unicode strings. Additionally, use v5.12
automatically turns on strict:
use v5.12; # now strictures are on $foo = 1; # compile-time error!
If, for some odd and dangerous reason you don’t want strict
on by default, you can turn it off yourself, even though unimporting it doesn’t give you the warning that you’ve left the paved roads, you’ve just violated your rental car contract, and there’s a chainsaw massacrer waiting for you:
use v5.12; no feature; no strict; my $foo = 1; $fo0++; # sure, go ahead and make that error
A workaround to restrict perl
versions
You can restrict the version more tightly by checking the value of the $]
variable, just like the various examples you saw in Item 83:
BEGIN { die "Unsupported version" unless $] >= 5.010 and $] < 5.011 }
This has the added benefit of restricting the upper acceptable perl
version. It works on older Perls too.
Things to remember
use VERSION
imports new features since Perl 5.9.5.BEGIN { require VERSION }
still imports new features (fixed in later versions of v5.10 and v5.12)- Use
no feature
orno strict
to unimport unwanted features. - Restrict the
perl
version with$]
.
The handful of basic Perl concepts
I’ve now given the second Effective Perl Programming class, this time a two-day master class at YAPC::NA 2010 in Columbus. The common comment during the class seemed to be “You just blew my mind again”. I’m also giving this talk in a one day format at YAPC::EU in Pisa on Aug 7 Continue reading “The handful of basic Perl concepts”
Respect the global state of the flip flop operator
Perl’s flip-flop operator, ..
, (otherwise known as the range operator in scalar context) is a simple way to choose a window on some data. It returns false until its lefthand side is true. Once the lefthand side is true, the flip-flop operator returns true until its righthand side is true. Once the righthand side is true, the flip flop operator returns false. That is, the lefthand side turns it on and the righthand side turns it off. Continue reading “Respect the global state of the flip flop operator”
Effective Perl Programming at YAPC::NA 2010
I’ll be teaching an Effective Perl Programming course at YAPC::NA in Columbus, OH on June 24 and 25 at the conference venue. The cost of the two day master class is just $240, and this year that includes your snacks and lunches each day.
Josh and I will also have a box of signed copies of the book, although those might go fast during the conference (and aren’t part of the course fee). Of course, you can also buy your book in advance and have us sign it during the conference. :)
Use scalar references to pass large data without copying.
References aren’t just for data structures, and many people overlook the benefit of references to simple scalars. With references to arrays and hashes you can keep those data structures in tact when you pass them to or return them from subroutines (Item 46: Pass references instead of copies). You don’t need to worry about scalar values because they are a single item in both the non-reference and reference form. Continue reading “Use scalar references to pass large data without copying.”
Effective Perl Programming looks better than most on the Kindle.
Here are some images from the Kindle version (on an iPad) of Effective Perl Programming. It doesn’t look bad considering how bad most other non-novels look on Kindle, and its readable. These are two non-consecutive pages: Continue reading “Effective Perl Programming looks better than most on the Kindle.”
Effective Perl Programming is now on Kindle.
Effective Perl Programming is now available in a Kindle edition:
Continue reading “Effective Perl Programming is now on Kindle.”
Use each() on an array in Perl 5.12.
Before Perl 5.12, each only took a hash argument. In list context, it returns a two item list of a key-value pair you had not seen yet (unless you changed the hash in some way that re-ordered it): Continue reading “Use each() on an array in Perl 5.12.”
A Chinese translation of Effective Perl Programming is in the works
There’s a Chinese translation of _Effective Perl Programming_ in the works. I don’t know when it will be available: the translation will take some time, then the publisher has to put it on paper, then it has to show up in stores. I don’t have any details on where or how you can buy the translation. If you know those, please let us know and we’ll post the details here (even using your referral link).
However, if you’re reading this directly, the Chinese edition might not matter to you. :)
If you know about any other translations, tell us about those too. Often the author doesn’t find out about them until they get a copy, if they ever get a copy.