#!/usr/bin/perl -T use strict; use CGI; use JSON; # クエリ変数qを取り出す my $cgi = new CGI(); my $q = $cgi->param('q'); # 計算処理を行う my $out = {}; if ( $q =~ /^([\d\-\+\*\/\.\(\)\s]+)$/s ) { my $e = $1; local $@; $out->{result} = eval($e); $out->{status} = $@ ? $@ : 'ok'; } else { $out->{status} = 'invalid query: '.$q; } # 結果をJSON形式で出力する my $json = JSON::objToJson( $out ); print "Content-Type: text/plain; charset=UTF-8\n\n"; print $json, "\n";
// calc.js // Copyright 2007 Kawasaki Yusuke http://www.kawa.net/ // 初期化処理は初回のみ実行する if ( typeof( window.Calc ) == "undefined" ) { // Calc オブジェクトのコンストラクタ(何もしない) var Calc = function () { return this; }; // バージョン番号 Calc.VERSION = '0.01'; // Calcオブジェクトのプロパティ(デフォルト値) Calc.prototype.cgiurl = 'calc.cgi'; Calc.prototype.status = '#status'; Calc.prototype.result = '#result'; // リモート計算を行うメソッド Calc.prototype.expr = function ( arg ) { // CGIに受け渡すパラメータオブジェクトを生成 var param = { q: arg }; // コールバック関数内ではthisが使えないのでコピー var __this = this; // JSONデータを受け取るコールバック関数 var func = function ( data ) { if ( ! data ) return null; if ( data.status != 'ok' ) data.result = ''; data.result += ""; $(__this.result).text(data.result); $(__this.status).text(data.status); }; // CGIを呼び出して、JSONデータを受け取る jQuery.getJSON( this.cgiurl, param, func ); }; }