I'd say the idea is not too complicated -- for every + you increase the ascii code, for every - you decrease it. In between, at every non-space character, you print the character corresponding to it. Or something like that, fact is it took me about 2 minutes to figure this out, and I think it's because the main body of the program is obvious (the for through each character loop).
How about the following suggestions to `improving the non-readability of your code':
- Use special Perl variables ($/ $= $,)
- Avoid overusing obvious keywords (eval, split), go for regexps if possible
- When using regexps, feel free to use characters other than forward slashes
- When quoting strings, feel free to use other quoting techniques (qq[])
I made a few superficial changes based on what I said, but I don't have Perl here, so I'll hope you at least get the idea if it doesn't run. Oh and I don't mean to offend if you already knew these things.
$==109;for(split//,q{
/
++++++
++o-------=++ ++
++_--------------<+
++,+++++++++ +/
-------- --
-/ {
){m?\s??():s:-|+:$=$&$&:?eval:print chr($=)}