use v5.10; use warnings; my $calculator = do{ use Regexp::Grammars; qr{ | | | | \( \) }xms }; while (my $input = <>) { my $debug = $input =~ s{^show \s+}{}xms; if ($input =~ $calculator) { if ($debug) { use Data::Dumper 'Dumper'; warn Dumper \%/; } else { say '--> ', $/{Answer}->eval(); } } } sub Answer::eval { my ($self) = @_; my $x = $self->{X}->eval(); my $y = $self->{Y}->eval(); return $self->{Op} eq '+' ? $x + $y : $x - $y; } sub Mult::eval { my ($self) = @_; my $x = $self->{X}->eval(); my $y = $self->{Y}->eval(); return $self->{Op} eq '*' ? $x * $y : $self->{Op} eq '/' ? $x / $y : $x % $y; } sub Pow::eval { my ($self) = @_; return $self->{X}->eval() ** $self->{Y}->eval(); } sub Term::eval { my ($self) = @_; return $self->{""}->eval(); } sub Literal::eval { my ($self) = @_; return $self->{value}; } #### $ perl5_10_1 demo_calc_class.pl 2-3-5 --> 4 #### $ perl5_10_1 demo_calc_class.pl 8/4/2 --> 4