I was teaching Perl again this week, and as part of the class I usually end up doing some sort of live programming demonstration. I started doing that around the year 2000, and it is as dangerous now as it was then.

I figured that too many students thought that I wrote code by starting at the top of the file and typed until I got the end of the file. Some people may come up with the entire program in their heads and type it out, but I generally program an outline, then circle around each main part as I add new features. If I don't do that, I start with one piece then program from the inside out.

If I do this in front of a bunch of people by having my typing projected onto a large screen, everyone gets to see all the stupid mistakes and typos that I make. It's generally good that they get to see that so they realize that although I'm exuding confidence in just about everything I tell them, I'm also a regular guy who makes all the same mistakes everyone else does. An expert is simply someone who has made every mistake, after all.

This isn't a list of problems with Perl, complaints about Perl, pleas for help, or anything else that merits attention. It's just documentation of my sometimes stupidity. It's the little details that cause more problems then program flow or big design issues. Go figure.

s/// at the end of a map()
No matter how often I remind myself that s/// does not return the string, my fingers still type the code as if it does. What do I really get? A list of the return values of s///, which are either 1s or empty strings.
my @array = map { s/regex/replacement/ } @input;
my %hash = { }; or my $hash = ( );
Once I got use to anonymous references, I started using them more than the named variables. If I have a data structure, I'm probably going to pass it around so I might as well start its life as a reference. A mistake that I've been making a lot this month is using the wrong constructor: the anonymous hash constructor when I want a named hash, and the list constructor when I want an anonymous hash. It's no one's fault but my own, really, but I still do it frequently, it seems.

print Dumper( $hash );
Can you see what's wrong with that? You'll find out quickly when you try to run that program: I didn't use Data::Dumper. Sometimes I wish that Perl was smart enough to figure that out and load the package for me. My favorite debugger is still print, and perl has to remind me to load Data::Dumper on the first go around for a new script.

( $year, $month, $day ) = ( localtime )[3,4,5];
No matter how many times I look it up, and how many times I use it, in moments of weakness I get it backwards. It's not that I think don't sync the left and right hand sides, but that I have it in my head that the year comes first. It's dumb that I think that because the size of the interval gets larger with higher indices.

my( $n, $m, $o ) = shift;
I start off with one variable and use shift to assign it a value, but then I need more variables, so I add them on the left-hand side, but I don't update the right-hand side. Sure it's dumb, but that doesn't mean that I don't do it.

brian d foy <>