This should theoretically be fairly
portable, but I've only tested it on 5.6.0/Linux and
5.8.0/ActiveState. If you don't like the first joke
it gives you, run it some more times and you won't like
the other ones either ;-)

update: code below this point is
my signature and is not part of the above
obfuscation. I've reworked the sig to start
with a semicolon in case someone uses them
together, but that was not the intention.

Yes, I initially wanted
to golf that down a little more and/or obfuscate it
a little better, and possibly apply it to more of the
text, but I ran out of steam.

It puts an exclamation point and newline on the output record seperator, which I think puts it at the end of the output whenever this program is run.

Whenever it prints out a string, actually. The only
reason it only happens once per run is because it only
prints one string per run. When I was developing the
thing, I had a loop that for testing purposes called
all of the closures, and so !\n was printed after each.

That's the first time I've ever de-obfuscated a program.

Addictive, isn't it? The first time I deobfuscated
something from Perlmonks, I went nuts afterward and
compulsively deobfuscated the next several obfus in a
row. It was a couple of days before I wanted to look
at "normal" code again.

I was looking at this again (due to
an issue someone was having) and happened
to notice something I missed before: you parsed this
incorrectly. The reference to @; occurs in scalar
context, so you get 4 not 0,0,0,0. It always helps
to pay attention to context. HTH.HAND.

Scalar found where operator expected at SlashDotLameJokeGen.pl line 22+, near ")
$;"
(Missing semicolon on previous line?)
syntax error at SlashDotLameJokeGen.pl line 22, near ")
$;"
Execution of SlashDotLameJokeGen.pl aborted due to compilation errors.

Missing comma after first argument to join or string function at ./joke.pl line 7, near "@_]"

Hmmm.... weird. Are you certain you copied it
exactly? This is line 7:

for join$',@$die[ $%,$==>$|]}}map{[map{sub

There's no occurance of @_] there. There
is one on line 6:

split//,pop@_]}@%= map{my$die=$_;sub{print

I don't see anyplace there on line 6 where a comma is
wanted, so maybe it really is talking about line 7,
but on line 7 there most certainly is a comma after
the first argument to join.

It has been reported to work on versions from 5.005
through 5.8.1, but it is possible that something
changed from then to 5.8.3 that throws it off. If
for example $' were handled differently,
that could maybe break it. Or if the precedence
tables changed -- but that seems unlikely; I don't
thing the precedence tables are going to change much
in Perl5, because that would break *lots* of existing
code. (Perl6 is going to change them, but Perl6 is
changing *lots* of stuff; Perl5 code will not be able
to parse as Perl6 code and mean the same thing,
generally, though Perl6 will be able to parse it as
Perl5 code.)

I'm not sure what the newest Perl I have access to is,
but I'm pretty sure it's not 5.8.3, so I'd have to do
an upgrade. I can't justify that here; maybe at home
later, time permitting -- but doublecheck also to make
sure you have the code copied exactly.

When putting a smiley right before a closing parenthesis, do you:

Use two parentheses: (Like this: :) )
Use one parenthesis: (Like this: :)
Reverse direction of the smiley: (Like this: (: )
Use angle/square brackets instead of parentheses
Use C-style commenting to set the smiley off from the closing parenthesis
Make the smiley a dunce: (:>
I disapprove of emoticons
Other