Get Learning Perl at 60% off today

Learning Perl

Learning Perl
Was: $31.99
Now: $12.80
(Save 60%)

Add to Cart

O’Reilly’s Cyber Monday Deals of the Day is offering Learning Perl, 6th Edition, for $US12.80. That’s 60% off the normal price. And, when you buy any ebook from O’Reilly, you get free updates for the life of the book.

The ebook comes in PDF, mobi, and ePub. You can choose any format you like, or choose them all. You get lifetime access to all the ebooks you buy and you can re-download them at any time.

The deal starts at 12:01 Pacific time, so some of you can get this deal on the following Tuesday. Use the offer code CYBERMONDAY, or follow the link in this post to add it to your basket right away.

Why we teach bareword filehandles

There’s a debate raging in Perl 5 Porters over some updates to perlopentut. Mike Doherty sent a patch to remove the bareword filehandles, stepping into the overlapping minefields of fashionable practice and documentation authorship. That second one is beyond the scope of Learning Perl, so I’ll ignore it even though that’s almost the entire debate.

There are three reasons we teach bareword filehandles in Learning Perl: generality, immediacy, and history. Having said that, we are not choosing between barewords or filehandle references, even if we do use the references for most of the book. We’re agnostic, and we leave it to our reader to make the best choice for them. We don’t see out job to tell you how to program. We just want to explain what Perl actually lets you do.

Generality: We don’t write books for individual people. That just doesn’t work since it would take more time than any author has, even if authors did nothing but write every second of every day. For a book such as Learning Perl which sells tens of thousands of copies just in the paper version, we have many sorts of people to think about, virtually none of whom we have ever met, will ever meet, and will never give us feedback. We don’t know why you are using Perl. You could be system administrators, web programmers, data mungers, or, sometimes, non-techies. We don’t know if you are writing new code or adjusting old code. We don’t know what you need, so we don’t make judgments based on what we don’t know. If you are talking to one of us during a face-to-face class, we can ask you questions and find out more about what you need.

Perl suffers from success in vastly different areas. You can write quick one-liners or huge, enterprise systems. You might need an interactive user interface, or not. Different tasks and different domains require different practices. Instead of assuming that you are going to limit yourself to just one of those areas, we aim to make Learning Perl useful to most of those areas.

Immediacy: In a tutorial like Learning Perl, we have to start somewhere. A bad book can quickly overload a reader with several concepts at once. Our goal is to get people writing code as soon as possible, which is the fundamental goal of Perl. Larry Wall wants people to be able to program even if they don’t consider themselves programmers. He doesn’t want people to have to spend hours of research to be able to doing something useful quickly. Larry’s term for this is “baby Perl”.

There are several concepts that go into a this single line of Perl, none of which are immediately useful to someone who wants to write the sort of short program we consider in Learning Perl:

open my $fh, '<', $filename or die '...';

In their first afternoon of Perl, the new programmer has to be comfortable with my as well as the concepts around open, its modes, and its lack of punctuation. That my $fh inside a larger expression is really confusing for beginners. We don't make any judgements based on that. We just know that's the way it is. To avoid the extra sources of confusion, it's easier to reduce the problem to one with the fewest distractions:

open FILE, $filename or die '...';

Don't forget that the tutorial for open is almost 1,000 lines long. This is not a simple built-in. Once people get used to the idea of a very basic open, we can expand on that to add more to the readers knowledge and understanding. All education is a continual process of refinement and adjustment as you integrate new concepts with what you already understand.

History: Finally, no matter what we personally think about one form or the other, we can't deny that people are going to see the bareword versions. The "Modern Perl" movement would like to pretend that bareword filehandles don't exist, but they can't ignore STDOUT, STDERR, STDIN, or DATA. Perl has bareword filehandles and most people are going to write new code using bareword filehandles, indeed, even relies on those barewords, even if they subscribe to all of "Modern Perl". Putting that aside, though, people are going to see bareword filehandles in old code. Our readers need to know what those are and what they do. Programming is not just about writing code, it's about reading code. We can't hide widespread patterns because they've become unfashionable to some people.

Matching Perl identifiers is a lot harder now

In the Learning Perl Student Workbook (first edition), I had an exercise to match a Perl variable with a regular expression. This is supposed to be a simple exercise with a simple answer, so I excluded any special variables, such as $1 or ${^UNICODE}.

A long time ago in a Perl far, far away, when character classes were much smaller (see Know your character classes under different semantics), the pattern seems simple: Continue reading “Matching Perl identifiers is a lot harder now”

A Unicode demonstration: Roman::Unicode

I just uploaded Roman::Unicode. It’s a silly little module to represent Perl numbers in roman numerals. I adapted it from Roman, but use the special roman numeral characters in the Unicode Character Set (UCS) instead of the ASCII versions. It’s not complete, but it’s a start.

So far I just have a start, but eventually I want to use this module to demonstrate various Unicode character things in my “Unicode in Perl” class. For instance:

  1. There are fancy characters for higher numbers, like ↁ (U+2181) for 5,000; ↂ (U+2182) for 10,000; ↇ (U+2187) for 50,000; and ↈ (U+2188) for 100,000. The ASCII-only module limits itself to 3,999 because of it’s limited character set. This module limits itself to 399,999.
  2. The roman numeral characters can compatibility-decompose to their ASCII versions. The Ⅰ (U+2160) is compatible to the capital I (U+0049) you already use. The single character Ⅷ (U+2167) can compatibility-decompose to the four characters V (U+0056) and I (U+0049) (times three).
  3. I want to do something to convert ASCII versions to the higher character versions.
  4. The roman numeral characters know they are numbers because they have the right properties. The ASCII versions don’t know that they are numbers.
  5. I don’t want to use some of the characters between (U+2160) to (U+2188), but not all of them, so I need to invent some custom character classes (although we did not talk about that in Learning Perl.
  6. You can lowercase these, even though they aren’t ASCII.
  7. These characters have numeric values, even though they aren’t 0-9.

I’m still thinking about the next bit, which actually isn’t classic roman numerals. After awhile, people figured out they needed larger numbers and started drawing bars over the numbers, and gates around groups of numbers to indicate higher orders of magnitude. I’d like to see if I could do that with the UCS.