after a few hours work, this is the best that i can come up with that doesn't deviate from your original algorithm. It's shorter by some 50+ characters (but still 6 characters over an 80-character, 4-line sig), and i'm sure more could be done; i just don't see what at the moment...
# This has been tested with perl 5.6.1 on Solaris 9 only
@a=map{sub{my$a="push\@s,($_[2]".join($_[1],('(pop@s||1)')x$_[0])."$_[
+3])";sub{
eval$a}}->(@$_)}[1,'','','x2'],[2,'+'],[2,'*'],[0,'',1],[1,'','print c
+hr'];&{$a
[$_]}for map{($f=ord(substr'"!3!+"%"#*9):B"--11$2A);"-!$):)1+!-%")*%")
+*-*%"!#'.
'#))*%2!2%"##))B)1!#"*"A$)",+B"$")*%"#)C*-1!3"-"%"#*A)1!1+,%"1*B',$_,1
+)-33)%8,$
f/8}0..111
anyone else?
jynx