|Please Boycott Amazon|
11 July 2003
History of changes to my pages, including this one.
Added in the last four weeks.
Updated in the last four weeks.
Don't hold your breath.
This area contains text, source code, and notes about my column in The Perl Journal. As new articles appear, I'll add them here.
How do Perl's regexes work on the inside? Suppose you were going to write a language like Perl, which has regexes, in a language like C, which doesn't? How might you do that?
Regex article main page
Regex article notes and errata page
Ray tracing is one of the most flexible and versatile methods of rendering three-dimensional computer images. In this article, I show you a simple ray tracing program written in Perl and explain how it works.
Ray Tracing main page
One of the most important new features in Perl 5 was the capability to manage complicated data structures like multidimensional arrays and nested hashes. To enable these, Perl 5 introduced a feature called `references', and using references is the key to managing complicated, structured data in Perl. Unfortunately, there's a lot of funny syntax to learn, and the manual is not as clear in this area as it usually is. The manual is quite complete, and a lot of people find that a problem, because it can be hard to tell what is important and what isn't.
Fortunately, you only need to know 10% of what's in the manual to get 90% of the benefit. This article will show you that 10%.
The deadline for written materials for The Perl Conference got in my way, so I wasn't able to do two articles again this issue. I put my regular Bricolage column on hold and wrote another article for novices. It's about how stadard I/O buffering works and shows typical traps and hazards and how to avoid and remedy them. I think even experienced programmers will learn something from it.
If you're sad that you missed my regular Bricolage column because it was on vacation, then seeing the notes for my conference talk might make you feel better.
This article discusses issues of variable scope and duration in Perl, including packages, namespaces, and the difference between my and local. The Big Secret: Perl has two separate and totally unrelated sets of variables.
This article discusses how data compression works. It comes with a module, Huffman, which implements a simple data compression scheme in Perl.
Caching is a straightforward way to speed up certain slow functions: You remember the return values by storing them in a cache, and if you are going to compute the same value again later, just get the result from the cache instead of recomputing it. It turns out it's not hard to build a facility that replaces any function with a caching version automatically; this is called memoization. This article explains how such a module works, and shows a number of interesting applications and contexts for memoization and caching.
In my article Coping With
Scoping I offered the advice ``Always use
local.'' The most common use for both is to
provide your subroutines with private variables, and for this
application you should always use
my, and never
local. But many readers (and the tech editors) noted that
local isn't entirely useless; there are cases in which
my doesn't work, or doesn't do what you want. So I
promised a followup article on useful uses for
local. That is what this article is about.
I wrote a tutorial article about what precedence is and how it works in Perl.
Read the Article
I also wrote a review of Perl 5 For Dummies, by Paul Hoffman, published by IDG books. The review was quite a surprise to me; it didn't turn out the way I expected at all.
I wrote an article for IEEE Software magazine; it's their first-ever article about Perl. It appears in Vol. 15, #1 (the January / February 1998 issue) pages 69-74.
It's partly an introduction to the language for people who have never seen it before, and partly a big boast about how great Perl is. I'm not sure I believe that Perl is as great as I made it out to be, but I do think it's pretty good.
Read the plain text of my last draft, or get a PDF copy of the published version from The Computer Society (Computer Society members only).
Current version: 1.41. Last update: 2001-09-04.
Current version: 0.61. Last update: 2000-10-24.
The Memoize module will make your functions faster by remembering their old values and reusing them instead of recomputing the same thing twice. It is very easy to use. Very very easy. Step 1: Say memoize('some_function'). Step 2: There is no step 2. I told you it was easy.
Current version: 0.53. Last update: 1998-04-09.
This module lets you define arbitrary string interpolation semantics, which means that you can control the way variables and other expressions interpolate into your strings. Perl already provides \L...\E and \U...\E to say that a string should be put into lowercase or uppercase when it's interpolated; Interpolation extends this notion. The notation is compact and readable, and you can have as many interpolators as you want.
Current version: 0.50. Last update: 1998-04-20.
Stat::lsMode is a module for displaying file permission modes in the style of the UNIX ls -l command. For example, a plain file that is world-readable and writable only by its owner is represented by the string -rw-r--r--.
Current version: 0.1. Last update: 1999-02-03.
Locked is a module for providing scalar variables that can be locked and unlocked. Unlocked scalars behave normally. Locked scalars abort the program if you try to assign to them. Variables can be locked and unlocked; you can also test them to see if they are locked or not.
It's also a fine demonstration of the power of tie
I just wrote this, so there's little documentation and no test suite yet.
This is one of the funniest pieces of software I have ever written. It is an absolute riot. And it is even possibly useful. It is called Identity, but I am looking for a better name. If you want to know why it's useful, it will help to read the explanation first.
I don't really believe that it is the stupidest. In fact, you should watch this space for the sudden appearance of other stupid programs. But it sure is mighty stupid though.
This one may give Addition a run for its money, if only because it takes so darn long to load.
Following a suggestion of Alex Davies, this module tries to automatically locate and declare all your subroutines at compile-time, so that you don't have to do it yourself.
Read the notes and then scrutinize the code.
Sometimes Perl can take a very long time to evaluate a regular expression match. Is this a problem with Perl's implementation of regexes? The answer is no; this paper shows that regex matching in Perl is NP-complete. This means that if you could come up with an efficient way to evaluate regex matches in Perl, you would become very famous because your method would also be an efficient way to solve many other well-known and difficult problems.
Someone on comp.lang.perl.misc wanted to know why nobody was answering his questions. In answer, I wrote an article about how to ask a question so that it'll get an answer.
Why doesn't print reverse $x work? And what is `Scalar Context'? And what is the scalar builtin function for? This short article explains contexts and the scalar function.
People show up in comp.lang.perl.misc all the time asking how to use the contents of a variable as the name of another variable. For example, they have $foo = 'snonk', and then they want to operate on the value of $snonk. This anecdote suggests that is probably a bad idea, and explains what you should probably be doing instead.
This follow-on article goes into more specifics about the sorts of things that can go wrong, and what to do instead.
Is there no end to this topic? No, apparently not.
This program demonstrates what happens When Hashes Go Wrong. It accepts one command-line argument, N, which defaults to 10,000. It then constructs N strings and uses them as keys for the hash. The strings are constructed so that their hash values are all the same, so they all go into one hash bucket. This turns the hash search into a linear search---very slow.
Perl has one small win here. Normally, Perl increases the number of buckets as the number of items in the hash increases. If it did that here, it would be wasting time and space, since this program only uses one bucket. But fortunately for Perl, this program doesn't trigger the condition that makes Perl expand the hash: Perl only does that when a key is inserted into a previously empty bucket.
This program, py, implements LALR(1) parsers in Perl. These are the sorts of parsers produced by YACC and Bison. But the program is a complete oddity. Find out why.
It occurred to me today that there was a language I'd heard about before that sounded a lot like Perl. I looked it up, and sure enough, it sounded just like someone in 1967 describing Perl. You can read the description of Perl '67 and try to guess what language is really being described.
Over the next few weeks I hope to research this language and learn whether it really does resemble Perl as much as it seems to. If so, it could be a valuable example lesson that could teach us a lot about how to develop Perl and what sorts of mistakes to avoid.
If you hated this page, you'll probably also dislike:
I'd be glad to get other people's recommendations of other pages of Perl Paraphernalia.
Software entities are more complex for their size than perhaps any other human construct because no two parts are alike. If they are, we make the two similar parts into a subroutine -- open or closed. In this respect, software systems differ profoundly from computers, buildings, or automobiles, where repeated elements abound.
Fred Brooks, Jr.
Return to: Universe of Discourse main page | What's new firstname.lastname@example.org