Oops, last submission had a copy-n-paste error
#!perl -p
sub
f{s/^-?\d+//?push@t,$&:s/.//+e("+-")+s///}sub
e{eval$x;while(s/^[@_]//){my$p=$&;eval$x;push@t,$p}}$x='$_[0]=~/-/?e("*/"):f';s/\s//g;e"+-";s/^/@t
/
|
What a horrible hack for just one stroke... Sigh...
#!perl -p
sub
f{s/^-?\d+//?push@t,$&:s/.//+e("+-")+s///}sub
e{eval$x;while(s/^[@_]//){my$p=$&;eval$x;push@t,$p}}$x='$_[0]=~/-/?e("*/"):f';s/
\s//g;e"+-";s/^/@t
/
|
just a tiebreaker improvement over my previous solution
#!perl -p
sub
f{s/^-?\d+//?push@t,$&:s/.//+&e+s///}sub
t{f;while(s+^[*/]++){my$m=$&;f;push@t,$m}}sub
e{t;while(s/^[+-]//){my$p=$&;t;push@t,$p}}s/\s//g;e;s/^/@t
/
|
three part recursion for expression, term and factor components
#!perl -lp
sub f{s/^-?\d+//?push@t,$&:s/.//+&e+s///}sub t{f;while(s+^[*/]++){my$m=$&;f;push@t,$m}}sub e{t;while(s/^[+-]//){my$p=$&;t;push@t,$p}}s/\s//g;e;$_="@t"
|