例:"fuga"を表示する、"hoge"なプログラム
$ perl -MAcme::EyeDrops=sightly -e '$b = `banner -w 48 hoge`; print sightly({ ShapeString => $b, SourceString => "print \"fuga\n\"", Regex => 1, Rotate => 270 })'
1 shapes completed.
''=~('('
."\?".
"\{".(
('`')|
'%').(
('[')^
'-').(
('`')|
'!').(
('`')|
"\,"). ((
'"')). ("\["^
'+').( ((
'['))^ (')')).( '`'|')') .('`'|'.') .( '['^'/')
.('{'^ '[').'\\'. '"'. ("\`"| '&').( ('[')^ '.') .''.
('`'|"'").('`'|'!'). ('!' ^'+' ).(( '\\')) .'"' ."\"".
'}'.')') ;($:)= '.'^ '~';$~ ="\@"| '(';$^ =')' ^'['
;($/)= ('`')| '.'; ($,) ="\("^ '}';$\ ='`' |"\!";
$:=')' ^"\}"; ($~) ='*' |"\`"; $^='+' ^'_' ;($/)=
('&')| '@';$, ='[' &'~' ;($\)= (',')^ '|'; ($:)
="\."^ '~';$~ ="\@"| '(';$^="\)"^ '[';$/ ="\`"| '.';
$,='(' ^"\}"; $\='`' |'!';$:=')'^ '}';$~ ="\*"| '`';
$^='+' ^"\_"; $/='&' |"\@"; $,='[' &"\~"; $\=','^'|';$:='.'^'~';
$~='@' |"\("; $^=')' ^"\["; $/='`' |"\."; $,='('^'}';$\='`'|'!';
$:=')' ^"\}"; $~='*' |"\`"; ($^) ="\+"^ '_';$/
="\&"| '@';$, ="\["& '~';$\ ="\,"^ '|';$: ="\."^
'~';$~ ="\@"| '('; ($^) =')'^"\["; ($/)
="\`"| '.';$, ='(' ^'}' ;( $\)=
('`')| '!';$: =')' ^'}' ;$~= '*'|
'`';$^ ="\+"^ '_'; ($/) ='&' |'@' ;(
($,))= ('[')& '~';$\ ="\,"^ "\|";$:= ('.')^ '~';
$~='@'|'(' ;$^=')'^ '[';$/="\`"| '.';$,='(' ^'}';$\='`'|
'!';$:=')' ^'}';$~= '*'| '`';$^='+'^'_' ;$/=
'&'|'@';$,="\["&
(( "\~"));$\=
(( ','))^'|';
($:) ="\."^
'~'; $~='@'
|'(' ;($^)=
(( ')')
)^(( '['));
$/='`'|('.');$,=
'('^'}';#;
$ perl -MAcme::EyeDrops=sightly -e '$b = `banner -w 48 hoge`; print sightly({ ShapeString => $b, SourceString => "print \"fuga\n\"", Regex => 1, Rotate => 270 })' 2> /dev/null | perl
1 shapes completed.
fuga
記号だけでプログラムを作成する原理は2006-11-07 - 兼雑記を読んで何となく理解したつもりだけど、そうやってできたプログラムを任意の形に書き出すってのはスゴいな…
しかもこのモジュール、オプションがやたら豊富でいろんなことができてしまう…!!
基本の形(camelなど)は既に.eyeファイルに入っているし、上記のように自分で形を指定することもできる。上記の例はbannerコマンドを利用して任意のASCII文字の形に指定している。
bannerコマンドが /usr/games/banner に入っていればsightly関数の引数に Shape => 'banner', BannerString => 'hoge' という具合に渡すことができるみたいだけど、Macでは /usr/bin/banner に入っているようで、モジュールからの呼び出しはできないようなので自前でコマンド実行した結果をShapeStringに指定してみた。さらにRotateを指定することで向きを変えることまでできてしまう!
一番の謎は「どうやってちょうど良く形通りに収まるように記号プログラムの長さを調節しているか」というところ。あと改行やスペースだって挟んでいい所とダメな所があるはずなので、そのあたりの調節もどうやっているのか、不思議だ。
頑張ってAcme::EyeDropsのソースを読んでいるところ。ほとんどそのへんの処理はpour_sightlyの中でやっているようだ。