sub reduce { my $exp = $_[0]; 1 while $exp =~ s{(\d+)\s+([*/])\s+(\d+)} { $2 eq '*' ? $1*$3 : $1/$3 }e; 1 while $exp =~ s{(\d+)\s+([+-])\s+(\d+)} { $2 eq '+' ? $1+$3 : $1-$3 }e; return $exp; }