$_="+21P-A6-d-.+i-51-12+V-#+22-;-L+6-2-H+6-21+R+3-5-13+T-12"; s/[#.A-Wild;]/ord$&/eg;while( /[-+]\d+/g ){ @a or @a=($&) and next; unshift @a, map {($_+$&)/2 => ($_-$&)/2} pop @a; } print map chr, @a;