Location : Home > Languages > Perl > Package
Title : Math::Expression
Toolbox Logo

名称

 Math::Expression - 数式/文字列式の評価


概要

use strict;
use Math::Expression;

my $ArithEnv = new Math::Expression;

# config ファイルから読み出す
my $tree1 = $ArithEnv->Parse('ConfVar := 42');

my $tree2 = $ArithEnv->Parse('ConfVar * 3');

...

$ArithEnv->Eval($tree1);
my $ConfValue = $ArithEnv->EvalToScalar($tree2);

説明

 eval を使わずに config/... にあるファイルから読んだ式を評価する。文字列・数式演算子がサポートされており、条件式・配列・関数もサポートしている。名前空間はセキュリティのため管理されており、ユーザ提供関数は変数値の設定/取得を行うことができる。エラーメッセージはユーザ提供関数を通じて表示される。これは高等なコンピュータ利用の方法ではない。

 式は最初のコンパイル(パース)され、結果のツリーは何度も実行(評価)される。評価結果は配列である。計算結果は格納された変数から取得することができる。
 さらなる使用例はモジュールのテストプログラムを参照のこと。

パッケージ関数

new

 他の関数を呼び出す際のハンドルを取得するために何をおいても最初の用いる必要がある。

SetOpt

 以下の内容を設定する。多くの場合、ユーザは関数を標準のものから拡張したくなる。

PrintErrFunc

 エラー発生時に呼び出される printf スタイルの関数である。エラーテキストはだらだらと開業しない。標準は printf STDERR である。

VarHash

 引数は変数を格納するために用いられるハッシュである。
 数回呼び出されるために名前空間を区別して管理することができる。通常は名称 EmptyList であるが、空の配列でもよい。この場合は変数に空の値が設定される。

VarGetFun

 変数の値を返す関数値を配列として指定する。
 引数:0 - new により返された値  1 - 欲しい変数名。
 適切な値がない場合には空の配列を返す。

VarIsDefFun

 変数が定義されていれば 1 を、そうでなければ 0 を返す。引数は VarGetFun と同じである。

VarSetFun

 変数の値を配列として設定する。
 引数:0 - new により返された値  1 - 設定されるべき変数名 2 - 配列として設定される値。
 返り値は変数の値。

VarSetScalar

 スカラを変数の値として設定する。
 引数:0 - new により返された値  1 - 設定されるべき変数名 2 - スカラとして設定されるべき値
 返り値は変数値。

FuncEval

 関数を評価する。
 引数:0 - new により返された値  1 - 評価されるべき関数名 2 - 関数の引数の配列。
 返り値は関数値。スカラまたは配列である。

AutoInit

 true であれば自動的に未定義値を初期化し、空文字列または '0' で埋める。デフォルトは連結(.)を除きエラーが原因で発生する未定義値で、常に結果は空文字列とする。

例:
my %Vars = (
   EmptyList       =>      [()],
);

$ArithEnv->SetOpt('VarHash' => \%Vars,
   'VarGetFun' => \&VarValue,
   'VarIsDefFun' => \&VarIsDef,
   'PrintErrFunc' => \&MyPrintError,
   'AutoInit' => 1,
   );

ParseString

 式をパースし、後に評価されるべきツリーを返す。
 引数:0 - new により返された値  1 - パースされるべき文字列
 エラーがあれば PrintErrFunc を通じて表示され、未定義値が返される。

CheckTree

 パースされたツリーをチェックする。
 引数:0 - new により返された値  1 - 評価されるべきツリー
 入力のツリーが返される。
 エラーがあれば PrintErrFunc を通じて表示され、未定義値が返される。

Parse

 ParseString と CheckTree を結合する。

VarSetFun

 関数を設定する。&SetOpt における記述を見よ。

VarSetScalar

 変数を設定する。&SetOpt における記述を見よ。

FuncValue

 関数を評価する。&SetOpt における記述を見よ。

EvalTree

 ツリーを評価する。結果は配列である。単一の値を期待するのであれば最後の(おそらく $# 番目)の要素を見よ。
 引数:0 - new により返された値  1 - 評価されるべきツリー 2 - 値ではなく変数名が返されれば true 。これを用いるべきではなく、代わりに &Eval または &EvalToScalar を用いよ。

Eval

 ツリーを評価する。結果は配列である。単一の値を期待するのであれば最後の(おそらく $# 番目)の要素を見よ。
 引数:0 - new により返された値  1 - 評価されるべきツリー

EvalToScalar

 ツリーを評価する。結果はスカラ(単変数)である。
 引数:0 - new により返された値  1 - 評価されるべきツリー

式で使うことのできる関数

 以下の関数を式の中で用いてもよい。もし自分で追加したければ &SetOpt で設定すること。POSIX パッケージには関数のいくつかを提供することになる。

int

 評価の整数部分を返す。

round

 入力に 0.5 を足し整数部分を返す。

split

 Perl の split で、0番目の引数は分割に用いられ、最後の引数は分割される。

join

 1..$# までの引数を結合する。0番目は分離したまま。

printf

 Perl 標準の printf で、フォーマットされた結果を返す。

mktime

 mktime に全ての引数を渡し、結果を返す。

strftime

 strftime に全ての引数を渡し、結果を返す。

localtime

 最後の引数に対し localtime の結果を適用する。

defined

 最後の引数に対し VarIsDefFun を適用する。

aindex

 最後の引数に対する引数を探索しインデクスを返す。見つからなければ -1 を返す。例えば以下の例では 1 を返す。

months := 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
aindex(months, 'Feb')

変数

 変数には3形態あるが使用に違いはない。変数名は英数字・数字(ただし $ または ${ で始まる)で、{} または $ の後ろには空白がないものとする。

Variable
$Variable
${Variable}
$123
${123}
$#
${###=##}

リテラル

 リテラルは以下の通り:整数・nn.nn のフォーマットの浮動小数点・引用符(', ")で囲まれた文字列。エスケープはリテラルではない。

演算子と優先順位

 演算子は Perl/C プログラマを驚かすことはない。:= を除いては。:= が右から左に結合することを除いては演算子は左から右に結合する。 優先順位は括弧によりオーバライドされる。単項の + 及び - はない。<> は!= に等しい。

* / %
+ -
.   (文字列の連結)
> < >= <= == != <>
lt gt le ge eq ne
&&
||
? :
,
:=

配列

 変数は配列として実装される。スカラを使いたければ(例えば + を使いたい)、配列の最後の要素のみを使えばよい。配列はコンマ演算子で構築され、, で連結される。

a1 := (1, 2, 3, 4)
a2 := (9, 8, 7, 6)
a1 , a2

により以下を得る。

1, 2, 3, 4, 9, 8, 7, 6

 さらに

a2 + 10

により以下を得る。

16

 配列は複数の値の代入にも利用できる。

(v1, v2, v3) := (42, 44, 48)

 もし値が多すぎれば最後の変数はリマインダとして用いられる。
 もし値が十分になければ最後の変数は変化しない。

条件式

 条件式は3項演算子で行う。

a > b ? ( c := 3 ) : 0

 条件式の結果として変数を割り当てることもできる。以下の例では aa または bb に値が設定される。

a > b ? aa : bb := 124

著者

 Alain D. D. Williams, <addw@phcomp.co.uk>

著作権とバージョン

 Version "1.14", これは $Math::Expression::Version で取得できる。

 Copyright (c) 2003 Parliament Hill Computers Ltd/Alain D D Williams. All rights reserved.

 本プログラムはフリーソフトウェアであり、Perl 本体と同等の条件で修正/再配布してもよい。著作権についての詳細はモジュールのソースを参照のこと。

Toolbox Logo
Updated : 2008/02/13