Tkil's Perl Examples

WARNING: This document is rather out of date; the author is hoping to update it sometime in the near future (as of 2008-12-18), but please watch out for broken links and other detritus. Thanks for your understanding.


Text Manipulation

escape-commas (numbered)
This program has its roots in a request made by goss (now known as bekj) on #perl a long time ago; December 1997 was the original date. She had a problem where she wanted to "escape" commas (by prefixing them with a backslash), but only if they were inside brackets. To make the situation hairier, the brackets themselves could be escaped.

My favorite bit of this program is the use of parentheses in a split statement, to break out parts of the string to treat differently.
[Saturday, 1999-05-29]

This script takes an HTML file as input, and generates a frameset for navigating it. The input format is not very flexible, but it does what I needed -- and the commenting / coding style is much more representative of my current habits than most of the rest of the programs on this page (that are about 10 years old).
To see it in action, it takes this input HTML file and turns it into this frameset.
jumbles (numbered)
Solves "Jumble" style word games. Algorithm suggested by Fmh on EFNet's #perl channel, in response to question from su-
[Sunday, 1998-12-13]

png-text (numbered)
A quick script to extract "tEXt" chunks from PNG files. Interesting primarily because it works with binary data in a straightforward fashion.
[Wednesday, 1999-01-27]

rev-sort (numbered) (and a slightly different version: rev-sort-2 (numbered))
Inspired by a question from wawb, this illustrates a fairly hairy sort routine designed to put "revisions" (such as "1.3" or "4.5.12") into ascending order. It seems to me that I could make it smaller, but this is what came to mind first -- and it does seem to work.
[Monday, 1999-04-19]

rot13-dict (numbered)
We got to talking about rot13 encoding (just a simple transposition cipher), and I was curious what words would rot13 to other valid words. Most amusingly, the word "tang" rot13's to "gnat" -- which is also it's reverse!
[Tuesday, 1999-03-02]

simple-template (numbered)
One of the most frequently asked questions on #perl involves expanding variable names in text strings, to do a sort of template or mail merge. Using actual variables for this is a bad idea, since you either have to duplicate perl's internal functionality to expand them, or you run the risk of expanding the wrong things. Using your own templating system gets around most of these issues; this is a simple example of such a system.
[Sunday, 1999-04-18]

Top [ Text Manip | Admin | Networking | WWW | CGI | Utilities | Math ] Index

Systems Administration

archive-ml (numbered)
I'm subscribed to many mailing lists. My preferred way to read them is to use procmail to split the incoming mail into various spool files, then split those spool files into individual messages using the nnml select method inside of Gnus (the insanely powerful newsreader that, in turn, runs inside the insanely powerful XEmacs and Emacs editors).

Unfortunately, this technique piles literally thousands of files in single directories, which makes many operations on those directories painfully slow. This is my answer to that problem; it goes through an entire directory, and tries to put individual files into subdirectories based on year and month.
[Sunday, 1999-06-13]

df-hash (numbered)
A simple example of how to build a hash-of-hashes dynamically. As flyte pointed out to me on IRC, however, this is only dynamic at the first level; the second level ("inner") hash is static. Oh well. It's unix-based, but the concept is pretty simple (assuming, of course, that you know what the "df" command does on unix...)
[Wednesday, 1998-11-11]

logwatcher (numbered)
A gaudy little app that might be useful on the head of a router somewhere. It displays current stats and a "tail -f" output of the system log. So far, I've only tested it on my Linux 2.2 box. It requires the Curses module from CPAN. Inspired by the firewall statistics program from
[Tuesday, 1999-10-12]

make-user-dirs (numbered)
How to go through your /etc/passwd file and create a bunch of directories. Dedicated to MorDecai. :)
[Thursday, 1998-12-10]

Top [ Text Manip | Admin | Networking | WWW | CGI | Utilities | Math ] Index

Network Programming

Also known as "Client/Server" programming, mostly using the TCP/IP protocol stack.

io-socket (numbered)
A trivial example demonstrating usage of the IO::Socket class. Someone on IRC asked, "Can I read and write from the same socket in perl?" The answer is yes (obviously), but a concrete example never hurt.
[Saturday, 1998-11-07]

martin-server (numbered) and martin-client (numbered)
Another version of the client and server scripts offered in the perlipc documentation, these two programs show some trivial interactions between a client program and a server. Nothing too impressive, but it is a nice, short example that covers the basics. Written in about an hour, in response to an e-mailed question.
[Wednesday, 2001-02-07]

perl-chat (numbered)
A very simple "chat server", modelled loosely after IRC interactions, but not nearly that complex. Mostly an exercise to convince myself that I really did understand the four-arg select function. This is not very secure, nor is it very flexible, but it was pretty darned amusing.
[Saturday, 1998-05-15]

port-forward (numbered)
A slightly more advanced program that uses IO::Select to redirect ports. All the values here are hard-coded, but the implementation is straightfoward. In response to a question by dynweb on EFNet #perl
[Saturday, 1999-05-22]

reverse-lookup (numbered)
A simple demonstration on how to look up hostnames given IP addresses.
[Monday, 1998-12-14]

tkil-masks (numbered)
veblen had a neat idea for dumping a table of netmasks and associated values. He asked me for a critique and/or a compression, and this was my answer.
[Sunday, 1999-07-11]

udc-server (numbered) and udc-client (numbered)
These are expanded versions of the examples given in the perlipc man page for doing UNIX-domain sockets. The primary advantage in these versions (over the original) is that the server code includes the support routines which are spread out in the original documentation.
[Monday, 1999-02-08]

Top [ Text Manip | Admin | Networking | WWW | CGI | Utilities | Math ] Index


fully-qualify (numbered)
Uses HTML::Parser and URI::URL to present an HTML document with all of its links "absolutized" to the appropriate base URL (either the original document URL, or the contents of the <BASE ...> HTML element. Inspired by a question from "Tac/Smokescreen Action Network" <> on the libwww-perl mailing list.
[Thursday, 2000-01-20]

get-link-desc (numbered)
Uses HTML::Parser to get a series of URLs along with any text inside the link. Inspired by some questions from phr.
[Monday, 1999-08-02]

link-extract (numbered)
A simple example using HTML::LinkExtor to yank some links out of a URL.
[Wednesday, 1998-12-09]

mp3-find (numbered)
Go through a directory hierarchy, looking for MP3 files. Output an HTML page that has convenient links to all of them. One of the more amusing points of this program was realizing that since I was splitting paths on "/"s, I could use "/" to start "private" keys in a hash that dealt with file names.
[Friday, 1998-11-27]

mp3-find-freeside (numbered)
My IRC friend Freeside came up with this basic algorithm as a one-liner. I reformatted the one-liner to be readable. It still illustrates Freeside's point -- sometimes, less is more.
[Friday, 1998-11-27]

redirect-check (numbered)
Follows a list of possible redirections, using a nifty feature of HTTP::Response.
[Monday, 1999-07-19]

Top [ Text Manip | Admin | Networking | WWW | CGI | Utilities | Math ] Index


browse-cds (along with its browse-cds-devel development version and MySQL DDL) [as CGI]
My most ambitious CGI to date. This has been my big "teach myself CGI and DBI programming" project. It uses MySQL to present a dynamic listing of my CD collection. Nothing too earth-shattering, I know, I know. But I did learn a fair bit. And yes, it's ugly as sin. Sorry.
[Tuesday, 1999-06-08]

checkpass (numbered) [as CGI]
A very simple script which checks for cleartext passwords. It's not very secure, and it doesn't handle the important concept of sessions at all. That is, once you've verified that they are who they say they are, how do you keep that information across different page visits? Inspired by a question from adidas.
[Thursday, 1999-06-10]

just-cds (numbered) [as CGI]
A simple fore-runner to the browse-cds CGI. It just dumps the entire contents of my Album table.
[Wednesday, 1999-06-02]

line-number (numbered) [as CGI]
A quick and dirty little utliity for displaying text files (typically, code listsings) with line number and green bars. I believe Randal Schwartz did something similar in one of his columns, but I can't seem to find it.
[Sunday, 1999-12-19]

Top [ Text Manip | Admin | Networking | WWW | CGI | Utilities | Math ] Index


bit-count (numbered)
Various ways of counting the number of bits set in a 32-bit integer, along with timing data.
[Wednesday, 1999-06-02]

iso-timestamp (numbered)
Use localtime and sprintf to make a decent timestamp in the ISO Fashion. In the meantime, I've come to conclude that using POSIX's strftime is almost always sufficient to my needs.
[Sunday, 1999-01-31]

map2 (numbered)
A two-list version of the built-in map function. Illustrates a useful use of subroutine prototypes.
[Sunday, 1999-05-30]

switch-example (numbered)
A brief example of how to implement a "switch" statement inside perl. A much more exhaustive treatise is available from Tom Christiansen.
[Thursday, 1999-04-15] (numbered) (and an test script (numbered))
Determine day-of-week from date. Algorithm from CRC Math Handbook (30th Ed).
[Sunday, 1998-12-13]

Top [ Text Manip | Admin | Networking | WWW | CGI | Utilities | Math ] Index


point-in-hull (numbered)
pdt posed a bit of a teaser the other evening on #perl. Given a set S of points (which, nominally, are the boundary of a possibly non-convex or self-intersecting polygon, but that doesn't matter here), and a point P, determine whether P is in the convex hull of the points in S. (All in 2D, in case it wasn't obvious.)

The solution had to be of order n, the size of the point set S. My solution is probably at least a little wasteful, but it does seem to work.

[Wednesday, 1999-12-01]

Top [ Commentary | Text Manip | Admin | Networking | WWW | CGI | Utilities | Math ] Index


Last modified: Thu Dec 18 23:22:45 MST 2008