
First, we fork off a process which simply dumps core.  As they say,
TMTOWTDI, so let's try a few.  The parent opens the core file, and
searches to find the error message "Array @%s missing the @ in
argument %d of %s()".  It pulls the string "the " out, and prints it.

Unfortunately, the way that the error strings are stored in the binary
executable is system dependant.  To compensate for this, if we don't
happen across the previous error string, we do a stat on our script,
then check to see if it's a symlink.  This will cause a fatal error,
which we catch with an eval.  The error string is "The stat preceding
-l _ wasn't an lstat", so we grab the first four characters off of the
error string an print them out.  (Thus the case of the 't' is system
dependant.)

We access $^X to find out how the name of the perl we are running
under (in case some yahoo name it something_other_than_perl), then do
a backtick execution with -v to get the version information. 

Do a pattern match on the version string to find three characters
repeated.  The version string starts off with "This is perl", so "is "
is repeated, and the next word is then "perl".  The pattern match in
the array (or is it list?) context returns the contents of the
parenthesis matched, both of which we assign into ^$X in a vain
attempt to draw your attention away from what's really going on
(though we will use it later, so remember it). 

Now we've got a list inside some parentheses, which we take a slice
of.  Hopefully, you'll still be trying to figure out why $^X was
assigned to, and think there's something more going on than just a
string in numeric context which will evaluate to '1', giving the
one'th match, which is still "perl".  We've got a print statement to
print it out, with a unary '+' just to get the priority straight.

We take "perl" (stored in $^X) and do some character translation on it,

	$^X=~y/lpr/ 31/

changing "perl" to "3e1 ".  The translation changed three characters,
so it returns three.

We take three and add it to the value in $^X (after the translation).
"3e1 " evaluates to 30, so we get 33.

We once again do a translation on $^X 

	$^X=~y/ 1/1 /

to swap the last two characters, changing "3e1 " to "3e 1", and add
the value of the translation on.  It translated two characters, so we
now have accumulated 35.

Now, we subtract the value in $^X to our total.  $^X now contains "3e
1" which evaluates to 3, so our total is 32.  We hand 32 into a pack
to get the ascii character whose decimal value is 32, or a space,
which we promply print out. 

By now you should be sick and tired of figuring out the numeric value
of the string stored in $^X, so we'll stop doing that.

Then, we read ourselves in, and write ourselves overtop the core file,
backwards and hand execution off to the newly backwards file.  It
prints out "journal\n", cleans up after itself and quits.

- Keith Arner
