AWKでQuine
最近、プログラミング言語AWKを買ったので、AWKのお勉強。
とりあえずQuineを書いてみます。
Quineとは、自身のソースコードを出力するプログラムです。
ポイントはソースコード本文を変数に入れて、それを出力するようにすること。その際に本文中に登場するダブルクォートとかを上手いこと置換していくこととかですね。
他の言語だとevalを使うこともあるそうですが、awkには無いので、printfを使います。
BEGIN{s="BEGIN{s=%c%s%c;printf(s,34,s,34);};";printf(s,34,s,34);}
これをquine.awkに保存して
awk -f quine.awk
これで、ソースコード本文が出力されます。
ですが、折角awkを使ってるんだから、コマンドラインから一行野郎で出力したいですよね。
コマンドラインからawkを書く場合は、コード中でシングルクォートが使えないので、\047を使うことで出力します。
ちょっと書いてみました。
$ awk 'BEGIN{s="awk @BEGIN{s=%c%s%c;S=s;gsub(/@/,%c\\047%c,s);printf(s,34,S,34,34,34);}@";S=s;gsub(/@/, "\047",s);printf(s,34,S,34,34,34);}'
awk 'BEGIN{s="awk @BEGIN{s=%c%s%c;S=s;gsub(/@/,%c\047%c,s);printf(s,34,S,34,34,34);}@";S=s;gsub(/'/,"\047",s);printf(s,34,S,34,34,34);}'
失敗!
シングルクォートの変換が上手くいかないったらないです。とりあえず今日は時間が来たのでこの辺までで終了。また今度やります。また今度やりますとなったときのやらない率ったらないですよね。