This isn't so much an obfuscation as an obfuscation of an interpreter for an obfuscated program in an obfuscated language (the aptly name brainf**k, which can be read about here). Thank god for eval.
#!/usr/bin/perl -w use strict; my($p,@m);@_=('>+++++++++[<++++++++>-]<++.>++++++[<++++++++>-]<-----.- +-.+.>++++++++[<---------->-]<----.>+++++++++[<+++++++>-]<++.>++++[<++ ++>-]<+.+.+++++.>++++[<--->-]<.---.>++++[<+++>-]<+.[-]>++++++++[<++++> +-]<.>+++++++[<+++++++>-]<-.>+++++++[<+++>-]<.+++++++++++++.------.[-] +>++++++[<++++++>-]<----.>++++++[<+++++++>-]<--.>++++++[<++++>-]<+.++. +++++++++.>++[<--->-]<.+++++++++++++.[-]++++++++++.');*$=sub{s/./$&;\n +/g;s/\+|-/P$&$&/g;s/</\$p--/g;s/>/\$p++/g;s/\./print chr P/g;s/,/P=or +d getc/g;y/[]/{}/;s/{;/while(P){/g;s/};/}/g;s/P/\$m[\$p]/g;eval;print +$@if$@};&$ for@_;
As a sidenote, i'm only using 7 of the 8 available instructions, though the interpreter can also handle the eighth. Can anyone spot what it is...

Replies are listed 'Best First'.
Re: Interpreted
by japhy (Canon) on Apr 19, 2001 at 21:42 UTC
    I offer this optimization:
    tr/[]<>.,+-//cd; s/(([+-])\2*)/P$2=@{[length$1]};/g; s/(([<>])\2*)/Q@{[('+','-')[$2eq'<']]}=@{[length$1]};/g; s/\./print chrP;/g; s/,/P=ord getc;/g; s/\[/while(P){/g; s/]/}/g; s/P/\$m[Q]/g; s/Q/\$p/g;


    japhy -- Perl and Regex Hacker
      very nice. slows the 'compiler' a little but a vast improvement to the generated code. since all the bf programs i've seen use long runs of +'s and -'s for data and >'s and <'s for finding/storing this makes a HUGE difference for larger scripts. The only optimisaion (golf?) i can offer is changing the tr/// to a y/// :)
Re: Interpreted
by japhy (Canon) on Apr 19, 2001 at 21:30 UTC
    Looks like , (which I believe is for input). If you like BrainF*ck, you'd like the Esoteric Language mailing list, hosted by Cat's Eye

    japhy -- Perl and Regex Hacker
      Well spotted. Just signed up to that list too - thanks for the pointer.
Re: Interpreted
by Anonymous Monk on Apr 23, 2001 at 21:55 UTC
    use strict; my ($p,@p)=(0); $_='>+++++++++[<++++++++>-]<++.>++++++[<++++++++>-]<-----.--.+.>++++++ +++[<---------->-]<----.>+++++++++[<+++++++>-]<++.>++++[<+++>-]<+.+.++ ++++.>++++[<--->-]<.---.>++++[<+++>-]<+.[-]>++++++++[<++++>-]<.>++++++ ++[<+++++++>-]<-.>+++++++[<+++>-]<.+++++++++++++.------.[-]>++++++[<++ +++++>-]<----.>++++++[<+++++++>-]<--.>++++++[<++++>-]<+.++.++++++++.>+ ++[<--->-]<.+++++++++++++.[-]++++++++++.'; s/./+{qw(> $p++ < $p-- + _++ - _-- . print+chr_ , _=ord+getc [ while(_ +){ ] })}->{$&}.";"/eg;s/_/\$p[\$p]/g;eval;
    I think its a little shorter ans a litle simpler!
      But this is Obfuscation - surely we don't want to make it simple :)
        but you can put the obfuscation in how you DO it and not how you WRITE it :)