summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordoy <doy@tozt.net>2009-01-25 21:07:12 -0500
committerdoy <doy@tozt.net>2009-01-25 21:07:12 -0500
commit0779460c7716b484a79c1a6082938547d023f45f (patch)
tree38e67fbf5d16eca3c31bf062bb4ae1977d30dd48
parentd45f080e704a30f510d7bdcf60fa0a66f94c858a (diff)
downloadbot-games-0779460c7716b484a79c1a6082938547d023f45f.tar.gz
bot-games-0779460c7716b484a79c1a6082938547d023f45f.zip
use Math::Expression::Evaluator rather than feeding expressions through perl's eval
-rw-r--r--lib/Bot/Games/Game/24.pm8
1 files changed, 4 insertions, 4 deletions
diff --git a/lib/Bot/Games/Game/24.pm b/lib/Bot/Games/Game/24.pm
index b4604f4..0f61845 100644
--- a/lib/Bot/Games/Game/24.pm
+++ b/lib/Bot/Games/Game/24.pm
@@ -4,6 +4,7 @@ use Bot::Games::OO;
extends 'Bot::Games::Game';
use List::Util qw/shuffle/;
+use Math::Expression::Evaluator;
has '+help' => (
default => '24 help',
@@ -34,7 +35,7 @@ augment turn => sub {
return "invalid numbers" unless $numbers eq $solution;
my $eval = $self->evaluate($expr);
- if ($eval == 24) {
+ if (defined($eval) && $eval == 24) {
$self->is_over(1);
return "$player wins!";
}
@@ -89,9 +90,8 @@ sub generate_24 {
sub evaluate {
my $self = shift;
my ($expr) = @_;
- return 0 unless $expr =~ /^[-\d\+\*\/\(\)]+$/;
- # XXX: ick ick ick
- return eval $expr;
+ return undef unless $expr =~ /^[-\d\+\*\/\(\)]+$/;
+ return eval { Math::Expression::Evaluator->new->parse($expr)->val };
}
__PACKAGE__->meta->make_immutable;