つくっちゃいました。

まずはこれをご覧ください。



使い方

JS側はこんなです。

runJSON = function(name, func, perl, dp){
    if (! this['JSONP']) JSONP = {};
    JSONP[name] = func;
    (function(d, uri){
        var s = d.createElement('script');
        s.charset = 'UTF-8';
        s.src = uri + '&s=' + encodeURIComponent(perl);
        if (dp) s.src += '&dp=1';
        s.id = s.src;
        d.body.appendChild(s);
    })(document, 'http://api.dan.co.jp/perleval.cgi?c=JSONP.' + name, perl, dp);
};
perlEval = function(src, dst, dp){
    var d = document;
    runJSON('perl', function(json){
        dst.innerHTML = '';
        if (1 /*@cc_on -1@*/){
            dst.appendChild(d.createTextNode(json.error || json.result));
        }else{
            dst.innerText = json.error || json.result;
        }
    }, src.value, dp);
};

注意点

それでサーバー側なのですが、以下のようにしています。

  • URIは
    http://api.dan.co.jp/perleval.cgi?c=callback&s=perl_source
  • perlは現時点で5.8.9です。他のAPIで使っているのと一緒です。
  • api.dan.co.jpにモジュールがインストールされれれば、それが利用できます。上記の例を見てのとおり、標準以外のものも使えます。
  • ファイルシステムの読み書きはできません。適宜DATAを利用してください。
  • 実行時間は一秒以内に抑える必要があります。さもないとtimeoutします。
    timeout reached.
  • サブプロセスは使えません。
    'fork' trapped by operation mask at - line 1.

きっかけは、Codepadへの不満。PerlのVersionが5.8.0と古すぎる上、HTMLベースだと再利用がちょっと大変。というわけで別の車輪を再発明したわけです。上のサンプルを見てのとおり、perlの範囲内であればcodepadより自由な環境が楽しめます。

無保証です。サービス期間だけではなく、どんなモジュールが使えるかまで含めて。その代わりご自由にお使いになれます。いろいろ試してみてください。Enjoy!

Dan the Perl Monger