satkaku

色々かいたものの試行錯誤

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);}'

 

失敗! 

シングルクォートの変換が上手くいかないったらないです。とりあえず今日は時間が来たのでこの辺までで終了。また今度やります。また今度やりますとなったときのやらない率ったらないですよね。