Perlスクリプトを数字列に変換するモジュールAcme::Decimalizeを作ってみた

前のエントリでマジメに勉強しようと誓ったばかりだけど、とりあえず作ってみようと思ったものは作っておかないと気が済まなかったので。


Acme::Decimalize」というAcme::Bleach系のモジュールを作ってみました。
http://github.com/sugyan/Acme-Decimalize

中身

あらゆるPerlスクリプトは10種類の記号と改行だけで表現できるか? - すぎゃーんメモで考えた記号化を数字に置き換えてみただけです。

使い方

このモジュールをuseすると、スクリプトを0~9の数字の羅列に置き換えることができます(途中、改行を挟む)。
例えば、以下のようなスクリプト'hoge.pl'

print'hoge
'

に対し、以下のコマンド

perl -MAcme::Decimalize hoge.pl

を実行すると、

use Acme::Decimalize;
1837124717591871892
24004
3545
97281615402733229047458089161
85592
4509
97329621610379408

7
25
863
41613
4089758877380

9710813010

と、ファイルを書き換えます。
この数字だらけのプログラムは、Acme::Decimalizeをuseしていれば元のファイルと等価な動作をするようになっています。

$ perl hoge.pl
hoge

useしていればいいので先頭行の文を取り除いた数字だけのテキストファイル'hoge.txt'

1837124717591871892
24004
3545
97281615402733229047458089161
85592
4509
97329621610379408

7
25
863
41613
4089758877380

9710813010

に対して、コマンドラインAcme::Decimalizeをuseしてやれば実行できます。

$ perl -MAcme::Decimalize hoge.txt
hoge


つまりテンキーだけでプログラムが書けるってことですね!
止ん事無き事情によりテンキーしか使えない状態になってしまっても、とりあえず

344
8950347131693813
97482
2

29303274
478449083038812141682173036
69755771543035526992
687132871364209111518
9991
068
9

75
30301182299699488764709282804430392814
8870520
50169
10706013031746
56406276248841296198673038
09880
4871142995848145472328132781497303017210430375658
1303504094930312
778832835232

というように数字キーとEnterキーだけで書いておけば、あとで

$ perl -MAcme::Decimalize fuga.txt
はろー、わーるど!

と、実行できるわけです。

その他の特徴

実はプログラムを数値に置き換えるということは'Acme::Bleach::Numerically'というモジュールで実現されています。
404 Blog Not Found:数値型言語誕生!
これはプログラムのすべての文字のコードをつなげて0から1の間の数値に変換するというもの。


しかしPerlには「TIMTOWTDI」という考え方があります。
必ずしもやり方は一つじゃなくても良いはず!ということで、Acme::Decimalizeでは毎回ランダムに違う数字列が出てくるようになっています。
例えば'ほげ'と出力するだけのプログラムでも、

use Acme::Decimalize;
176031398186714812
978749427101656349
2
48101472233539

101598
922
385101
43675866721249816
642510173
8
61010907881014270341018896921248107491013
07101
834101427810175
312415212

とか

use Acme::Decimalize;
5974571454625045

867901
2953562420896108535097
12
778
535811847486
25359067218
0445801456
664853534241653541338953527
0
0535081274580457
025352830535322453509
7535
47158059858

とか

use Acme::Decimalize;
4193489646504264208529192
3474

6
816

2147432510321560474191060
88064745398983591
4129647

7624745695
54746800114740956864742172934126480284740
02474
37947421
6474768041243141

というように、毎回ちがう結果が得られます。が、実行結果はすべて同じです。

おまけ

オプションで'print'を指定するとプログラムの書き換えは行わずに変換後のプログラムを標準出力にprintします。いきなり書き換えて試さずに、これをリダイレクトして別ファイルを作成すると安全かもしれません。

$ perl -MAcme::Decimalize=print hoge.pl
use Acme::Decimalize;
579586050135205436804288291604


05752641880

3000112073575
984339464381
283365751
132946204636
7982575920
66
11


929342854259454


あと、改行したくない派のヒトは'space'オプションをつけると改行の代わりに半角スペースを使った表現に変更します。

$ perl -MAcme::Decimalize=print,space hoge.pl
use Acme::Decimalize;
4142064637456435270288 5861  5870494508877 026130657 224948 0 505 07623032757494 76328635 7 63891 54941132611238 0751 69648541848

これもちゃんと解釈して元のコードと等価な動作をします。

課題

  • テストとかドキュメントとか全然書いてないです
  • デカいファイルとかを変換すると上手く実行されないことがあります。要調査