The CPAN directory of Randal L. Schwartz

Hi. I'm Randal L. Schwartz, general manager of Stonehenge Consulting Services, Inc. You can reach me by email at

Things in the CPAN

A browseable list of things I have in the CPAN can be browsed at the MERLYN directory on

Things not in the CPAN

I've heard that putting an index.html file into my CPAN directory helps people find things that aren't in the CPAN for me. So here goes:
My home page
My recommended books page
My recommended books page at lists the Perl books (and other books) that I would pay money for, and includes an link to those books for easy purchase.
Stonehenge Consulting Services, Inc. home page
Perl Training from Stonehenge
A full description of on-site and open-enrollment Perl training is available at
Various pictures I've taken
I've snapped thousands of digital pictures over the past few years with my Nikon CoolPix and Canon DSLR and Powershot cameras. Check them out at
My WebTechniques Perl columns
Probably the most visited area of my website, every past monthly column I've done for WebTechniques Magazine is available online at These columns give basic examples of techniques of using Perl for the web, including examples of and LWP. Also, the code listings are brought out into a separate link for easy downloading. Sadly, the magazine itself has gone away, so there won't be any more of these articles.

You can go directly to these columns:
CPAN, NNTP, Clarinet Comics (Apr 96) listing
Giving 'more' (May 96) listing
Getting 'more' (Jun 96) listing
flocking, recent visitors (Jul 96) listing
tiny database, htaccess (Aug 96) listing
what's new? (Sep 96) listing
bad links (Oct 96) listing
browser dependence (Nov 96) listing
random thoughts (Dec 96) listing
tracking bad hits (Jan 97) listing
anonymous proxy server (Feb 97) listing
searchable web pages (Apr 97) listing
non-visitor counter (May 97) listing
better bad links (Jun 97) listing
back issues of Dilbert (Jul 97) listing
web chats (Aug 97) listing
two-pass image serving (Sep 97) listing
front door, please! (Oct 97) listing
Watch that picture change (Nov 97) listing
search in progress page (Dec 97) listing
Slow down the download! (Jan 98) listing
Tar'ing up a tree (Feb 98) listing
Doctor is IN (part I) (Mar 98) listing
Doctor is IN (part II) (Apr 98) listing
Where did they go? (May 98) listing
How did they get here? (Jun 98) listing
Parallel bad links! (Jul 98) listing
Parallel stress tester (Aug 98) listing
Thumbnails with PBMTOOLS (Sep 98) listing
Converting HTML to (Oct 98) listing
Special purpose mirrors (Nov 98) listing
A remote cookie jar (Dec 98) listing
Handling hundreds of pictures (Jan 99) listing
Prefork-Compressed Proxy Server (Feb 99) listing
Incremental link verifier (Mar 99) listing
Add image size to links (Apr 99) listing
Perl jobs and GIFgraph (May 99) listing
Processing forms remotely (Jun 99) listing
Countdown to Y2K (Jul 99) listing
Handling multipage forms (Aug 99) listing
mod_perl-enabled picture server (Sep 99) listing
Meta-keywords index generation (Oct 99) listing
Automatically testing a form (Nov 99) listing
Search This Site (Dec 99) listing
What's new with RSS (Jan 00) listing
Uploading files, sending MIME (Feb 00) listing
Building an icon factory (Mar 00) listing
Web access logs with DBI (Apr 00) listing
Self-registering password protection (part 1) (May 00) listing
Self-registering password protection (part 2) (Jun 00) listing
Simple queries with XML and DBD::RAM (Jul 00) listing
Making .tar.gz files on the fly (Aug 00) listing
Getting image colors to text (Sep 00) listing
Highlander: one instance at a time (Oct 00) listing
Poor man's load balancer (Nov 00) listing
Poor man's web chat (Dec 00) listing
Leveraging with Open Source (Jan 01) listing
Visualizing your traffic flow (Feb 01) listing
Simplified Voting - Am I Hot or Not? (Mar 01) listing
Simplified Voting - Am I Hot or Not? [magazine version] (Mar 01) listing
Embedding a dynamic image in CGI (Apr 01) listing
Basic cookie management (May 01) listing
Hooking up with the news (Jun 01) listing
Calculating download time (Jul 01) listing
Getting One-Click Processing (Aug 01) listing
Simple Table-Output Spanning and Sorting (Sep 01) listing
Rendering a calendar to HTML (Oct 01) listing
Customer Surveys and Writing XML (Nov 01) listing
Keeping robots from stuffing your forms (Dec 01) listing
Generating clickable graphs (Jan 02) listing
Retiring at 70 (Feb 02)  

My UnixReview/SysAdmin Perl columns
Similarly, every past bi-monthly column I've done for UnixReview Magazine is available online at However, my column outlived the magazine, and is now published both online and in hardcopy for SysAdmin Magazine. I still call it the UnixReview columns however. These columns give a basic introduction to Perl in easily digestible chunks.

You can go directly to these columns:
Basic Parsing (mar 95)  
Word Counts (may 95)  
Regular Expressions (jul 95)  
Tiny Database (sep 95)  
Subroutines (nov 95)  
Sorting (jan 96)  
Simple References (mar 96)  
Subroutine References (may 96)  
Text-grep (jul 96)  
Wrappers (sep 96)  
List manipulation (nov 96)  
Here documents (jan 97)  
Intro to objects (mar 97)  
More about objects (may 97)  
Logfile analysis (jul 97)  
Recursive directory tasks (sep 97)  
Finding shadowed executables (nov 97)  
Bit operations (jan 98)  
Include files (mar 98)  
Expressions in text (jun 98)  
Making choices for choices (aug 98)  
Using the CPAN effectively (oct 98)  
Editing files in-place (dec 98)  
Persistent data (feb 99)  
Getting a date with Perl (apr 99)  
Computing primes (jun 99)  
Expanding symbolic links (aug 99)  
Compiling regular expressions (oct 99)  
Figuring phone-y words (dec 99)  
Deep copy and recursion (feb 00)  
Rainy Day Templating Fun (apr 00)  
Simple tricks with printf (jun 00)  
Taint checking made simple (aug 00)  
Little acts of magic (oct 00)  
So what's the difference? (dec 00)  
What is that, anyway? (feb 01)  
A MIME is a terrible thing to waste (apr 01)  
It's all about context (jun 01)  
Developing a Perl routine (aug 01)  
Parsing interesting things (dec 01)  
Doing many things, like pings (may 02)  
Parsing and summarizing a logfile (jul 02)  
Finding old things (sep 02)  
Automatically extending your data (nov 02)  
The duct tape of the internet (Jan 03)  
Variables and Scoping (May 03)  
The Simplicity of Sockets (Jul 03)  
Computing Securely (Sep 03)  
Speeding up your Perl programs (Nov 03)  
Sharing Open Source code through the CPAN (Jan 04) listing
Monitoring Net Traffic with OpenBSD's Packet Filter (Mar 04) listing
Constructing Objects (May 04)  
Lightweight Persistent Data (Jul 04)  
Strictly speaking about use strict (Sep 04)  
Commonly used parsing techniques (Nov 04)  
Checking your bookmarks (Jan 05) listing
Understanding the Command Line (Mar 05)  
Avoiding SQL Injection Attacks (May 05)  
Nicer Configuration Files (Jul 05)  
How to match common things (Sep 05)  
Common network procotols (Nov 05)  
Generating object accessors (Jan 06)  
Inside-out Objects (Mar 06)  
Sorting with the Schwartzian Transform (May 06)  
Practicing Best Perl (Jul 06)  
Perl 6 is coming! (Sep 06)  
Formatting reports with Template Toolkit (Nov 06) listing

My Perl Journal columns
And, every past monthly column I've done for The Perl Journal is available online at These columns are generally a bit more advanced than the others.

You can go directly to these columns:
Watching log files (May 03) listing
Cleaning up your HTML (part 1) (Jun 03) listing
Cleaning up your HTML (part 2) (Jul 03) listing
Understanding object destructors (Aug 03)  
Safe CGI Death (Oct 03) listing
Free as in Music (Nov 03) listing
Blocking Spam with Postfix and Amavis (Dec 03)  
Evaluating short-circuited boolean Expressions (Jan 04)  
Watching a logfile in an IRC channel (Feb 04) listing
A better Data::Dumper (Mar 04) listing
Graphical interaction with POE and Tk (Apr 04) listing
Eight Million Ways to die (May 04)  
Hey use guys! Import this! (Jun 04)  
Cleaning up a symlink mess (Jul 04) listing

My Linux Magazine Perl columns
And finally, every past monthly column I've done for Linux Magazine is available online at These columns are delayed from hardcopy by 90 days, so you may have to wait a while before seeing them show up here. These columns give a basic introduction to Perl in easily digestible chunks, with an emphasis on things interesting to Linux users.

You can go directly to these columns:
Using things from the CPAN (Jun 99) listing
Tieing up loose ends (Jul 99) listing
Scripting your Apache server with Perl (Aug 99) listing
Random sentence generator (Sep 99) listing
Many ways to launch processes (Oct 99)  
No News is not Good News (Nov 99) listing
Watching your web server (Dec 99) listing
Getting better references (Jan 00)  
Subroutine references (Feb 00)  
Filehandle references (Mar 00)  
Intro to objects, part 1 (Apr 00)  
Intro to objects, part 2 (May 00)  
Moving your news service (Jun 00) listing
Capturing CGI Errors as Email (Jul 00) listing
Getting your kids to do the work (Aug 00) listing
Forking parallel link checker (Sep 00) listing
Throttling your web server (Oct 00) listing
Discovering incomprehensible docs (Nov 00) listing
Chaining Babelfish for silly translations (Dec 00) listing
Caching in your chips (Jan 01) listing
Getting some directory assistance (Feb 01)  
Headlines in the news (Mar 01) listing
Authenticated remote updates (Apr 01) listing
Processing footnotes (May 01) listing
Simple online quiz technique [part 1] (Jun 01) listing
Simple online quiz technique [part 2] (Jul 01) listing
Understanding regular expressions (Aug 01)  
Cleaning out a logging database (Sep 01) listing
Safe undumping (Oct 01) listing
Finding files incrementally (Nov 01) listing
Word of the day for PostgresSQL (Dec 01) listing
Smoke and mirrors (Jan 02) listing
Who's got the button? (Feb 02) listing
Caching those database accesses (Mar 02) listing
Serving up a piece of tar (Apr 02) listing
Filling a pipe - web traffic analysis (May 02) listing
Looking for lossage (Jun 02) listing
Template-driven file management (Jul 02) listing
Watching long processes through CGI (Aug 02) listing
Handling partially-filled query forms (Sep 02) listing
Doing many things at once (Oct 02) listing
Mirroring your own mini-CPAN (Nov 02) listing
Browsing a local CPAN mirror (Dec 02) listing
What Perl got right (Jan 03)  
Finding things (Feb 03)  
Finding things by rule (Mar 03)  
Web scraping with WWW::Mechanize (Apr 03) listing
Persistent storage for data (May 03)  
The Wrong Parser for the Right Reasons (Jun 03)  
Finding Similar Images (Aug 03) listing
The Basics of Hashes (Sep 03)  
Checking links with Class::DBI (Oct 03) listing
Checking website health [part 1] (Nov 03)  
Checking website health [part 2] (Dec 03) listing
Using xsh to scrape web pages (Jan 04) listing
Prototype Programming for Classless Classes (Feb 04)  
Creating an Inline language (Mar 04) listing
List Manipulation (Apr 04)  
Using Perl/Tk for Simple Graphing (May 04) listing
Introduction to Template Toolkit - Part 1 (Jun 04)  
Introduction to Template Toolkit - Part 2 (Jul 04)  
Introduction to Template Toolkit - Part 3 (Aug 04)  
Template Toolkit for Proxy Server Management (Sep 04)  
Introduction to mod_perl (part 1) (Oct 04)  
Introduction to mod_perl (part 2) (Nov 04)  
Introduction to mod_perl (part 3) (Jan 05)  
Creating Class::DBI relationships automatically (Feb 05) listing
Fit to be tied (part 1) (Mar 05)  
Fit to be tied (part 2) (Apr 05)  
Introduction to CGI::Prototype (part 1) (May 05)  
Introduction to CGI::Prototype (part 2) (Jun 05)  
Introduction to CGI::Prototype (part 3) (Jul 05)  
File::Finder: finding files easier (Aug 05)  
Babysitting an interactive CPAN update (Sep 05) listing
Profiling in Template Toolkit via overriding (Nov 05) listing
Debugging Web Applications (Dec 05)  
Using a database for a web server log (part 1) (Jan 06) listing
Using a database for a web server log (part 2) (Feb 06) listing
Building a static website with Template Toolkit (Mar 06) listing
Adapting CGI::Prototype for Apache Action Scripts (Apr 06)  
Packing it in (May 06)  
Web 2.0 meets Usenet 1.0 (Jun 06) listing
Progress Bars for Download (Jul 06) listing
Pluggable Behavior with a twist (Aug 06) listing
Searching my columnswith POE and IRC (Sep 06) listing
Wrap your database rows with Rose (Oct 06)  
Setting up Rose::DB::Object Metadata (Nov 06) listing