sub solvepart($); ... sub reformat; ... sub reformat($){ ... sub solvepart($){ #### if ($given ~~ /(?:exit)|(?:end)|(?:quit)/i){ ... if ($VERBOSE or $VERBOSE ~~ /v(?:erbose)?/i){ #### my $num=qr/(-?\d++\.?\d*?)/; ... unshift(@stack, [$2,$3,$4]) while $given =~ s/(.*)\((\S++) ++(-?\d++\.?\d*?) ++(-?\d++\.?\d*?)?\)/$1/; #### if ($level[0]eq'+'){ $level[2] ?($value=$level[1]+$level[2]) :($value+=$level[1]); } elsif ($level[0]eq'-'){ $level[2] ?($value=$level[1]-$level[2]) :($value=$level[1]-$value); } elsif ($level[0]eq'/'){ $level[2] ?($value=$level[1]/$level[2]) :($value=$level[1]/$value); } elsif ($level[0]eq'*'){ $level[2] ?($value=$level[1]*$level[2]) :($value*=$level[1]); } elsif ($level[0]eq'**'or$level[0]eq'^'){ $level[2] ?($value=$level[1]**$level[2]) :($value=$level[1]**$value); } elsif ($level[0]eq'%'){ $level[2] ?($value=$level[1] % $level[2]) :($value=$level[1] % $value); } #### if ($level[0]eq'+'){ $value = $level[1] + $level[2] || $value; } elsif ($level[0]eq'-'){ $value = $level[1] - $level[2] || $value; } elsif ($level[0]eq'/'){ $value = $level[1] / $level[2] || $value; } elsif ($level[0]eq'*'){ $value = $level[1] * $level[2] || $value; } elsif ($level[0]eq'**'or$level[0]eq'^'){ $value = $level[1] ** $level[2] || $value; } elsif ($level[0]eq'%'){ $value = $level[1] % $level[2] || $value; } #### #!/usr/bin/perl use warnings; use strict; use Scalar::Util 'looks_like_number'; my $MAXITERATIONS = 500; while ( <> ) { my $iterations = 0; 1 while s/(\([^()]+\))/ die "MAX ITERATIONS ACHIEVED: ABORTING\n" if ++$iterations >= $MAXITERATIONS; solvepart( $1 ) /eg; print "\nANSWER: $_\n\n"; } sub solvepart { my $expression = shift; $expression =~ tr/()//d; $expression =~ s/\^/**/; my ( $operator, @values ) = split ' ', $expression; $operator =~ /\*\*|[+\-*\/%]/ && @values >= 2 && @values == grep looks_like_number( $_ ), @values or die "IMPROPER INPUT\n"; eval join $operator, @values; }