Main Content

How not to write Perl?

Archive - Originally posted on "The Horse's Mouth" - 2008-01-15 23:43:34 - Graham Ellis

You can write a piece of code that resembles a Picasso ... or a piece of code that resembles a dog's dinner ... in Perl. And, rush job yesterday, I wanted to analyse a web access log file and find the number of unique visiting hosts listed. Here's what I came up with:

open (FH,"t09");
while (<FH>) {
  ($j)=split;
  $k{$j}++;
}
@s = keys(%k);
print @s+0,"\n";
foreach $host(sort {$k{$a} <=> $k{$b}} @s) {
  print "$k{$host} $host\n";
}


VERY quick. And VERY dirty, but it works:

[root@p15161732 logs]# perl t09d
291
1 84.16.235.40
1 62.31.153.127
1 86.6.163.203
1 213.40.135.44
[etc]
17 74.6.8.73
25 86.164.206.136
28 194.83.245.226
32 86.151.173.104
55 217.44.22.70
77 82.46.84.146
302 82.33.81.221
[root@p15161732 logs]#


So that's 291 unique hosts, and also some stats on who they are / the distribution of hits.

Why do I question whether or not this is good Perl? Because it will be VERY HARD to maintain later on. Variable names are not descriptive. No comments. No data validation. No checking to see if the input file actually exists. No report on the output as to what it is. No copyright statement / author notes. And that's just or starters.

For a one off - strictly a one off - these things probably don't matter; after all, Perl is the PRACTICAL extraction and reporting language and it did a very practical job of extracting what I needed here!

Learn Perl
The web page I was analysing