Take me over?
NAME
Math::Expression::Evaluator - parses and evaluates mathematic expressions
SYNOPSIS
use Math::Expression::Evaluator;
my $m = new Math::Expression::Evaluator;
print $m->parse("a = 12; a*3")->val(), "\n";
# prints 36
print $m->parse("2^(a/3)")->val(), "\n";
# prints 8 (ie 2**3)
print $m->parse("a / b")->val({ b => 6 }), "\n";
# prints 36
print $m->parse("log2(16)")->val(), "\n";
# prints 4
DESCRIPTION
Math::Expression::Evaluator is a simple, recursive descending parser for mathematical expressions. It can handle normal arithmetics (includings powers ^), builtin functions like sin() and variables.
Multiple exressions can be seperated by whitespaces or by semicolons ';'. In case of multiple expressions the value of the last expression is returned.
Variables can be assigned with a single '=' sign, their name has to start with a alphabetic character or underscore [a-zA-Z_], and may contain alphabetic characters, digits and underscores.
Values for variables can also be provided as a hash ref as a parameter to val(). In case of collision the explicitly provided value is used:
$m->parse("a = 2; a")->val({a => 1});
will return 1, not 2.
The following builtin functions are supported atm:
trignometric functions: sin, cos, tan
inverse trigonomic functions: asin, acos, atan
Square root: sqrt
exponentials: exp, sinh, cosh
logarithms: log, log2, log10
constants: pi() (you need the parenthesis to distinguish it from the variable pi)
other: theta (theta(x) = 1 for x > 0, theta(x) = 0 for x < 0)
METHODS
- new
-
generates a new MathExpr object. accepts an optional argument, a hash ref that contains configurations. If this hash sets force_semicolon to true, expressions have to be separated by a semicolon ';'.
- parse
-
Takes a string as argument, and generates an Abstract Syntax Tree(AST) that is stored internally.
Returns a reference to the object, so that method calls can be chained:
print MathExpr->new->parse("1+2")->val;Parse failures cause this method to die with a stack trace.
- val
-
Executes the AST generated by parse(), and returns the number that the expression is evaluated to. It accepts an optional hash reference that contain values for variables:
my $m = new MathExpr; $m->parse("(x - 1) / (x + 1)"); foreach (0 .. 10) { print $_, "\t", $m->val({x => $_}), "\n"; } - optimize
-
Optimizes the internal AST, so that subsequent calls to
val()will be a bit faster. SeeMath::Expression::Evaluator::Optimizerfor performance considerations and informations on the implemented optimizations.But note that a call to
optimize()only pays off if you callval()multiple times. - variables
-
variables()returns a list of variables that are used in the expression.
INTERNALS
The AST can be accessed as $obj-{ast}>. Its structure is described in Math::Expression::Evaluator::Parser (or you can use Data::Dumper to figure it out for yourself).
LICENSE
This module is free software. You may use, redistribute and modify it under the same terms as perl itself.
AUTHOR
Moritz Lenz, http://moritz.faui2k3.org/, moritz@faui2k3.org
DEVELOPMENT
You can obtain the latest development version via subversion:
svn co https://casella.verplant.org/svn/moritz/cpan/Math-Expression-Evaluator/