ゆの in awk

「ゆの in language」を含む注目エントリーcho45のブックマーク / ゆの in languageを見ていただくと分かりますが、何故かブームのようです。 アニメーションの方はTBSアニメーション「ひだまりスケッチ×365」公式ホームページを見てもらうとして、どうも「×」のついた彼女が「ゆの」のようです。 最近、アニメに疎くなってしまったので、アニメ自体が面白いかどうかは不明です。orz

さて、awk ですが、他の言語を見ると class を用いてオブジェクト指向で解いたり、オーバーライドしたりしていますが、awk はオブジェクト指向でもなければ、オーバーライドもできません。 しかも、関数を定義したら必ず括弧を付けて呼ぶ必要があり、Tcl のように単純にもできません。

これをどう解くかですが、Linux 前提かつ gawk, xgawk 前提ではありますが、以下のようにしてみました。

#! /usr/bin/gawk -f
# yuno.awk
# http://b.hatena.ne.jp/t/%E3%82%86%E3%81%AE%20in%20language

BEGIN {
    X = x();

    X / _ / X < "来週も見てくださいね!"

}

# 自分自身のスクリプトを読み込む方法 orz
function x() {
    getline self < "/proc/self/cmdline";
    split(self, arr_self, "\0");
    my_name = arr_self[3];
    while (getline < my_name > 0) {
        if ($1 == "X" && $5 == "X") {
            gsub(/"/, "");
            message = $NF;
        }
    }
    close(my_name);
    print "ひだまりスケッチx365 " message;
    exit;
}

つまり、自分でオーバーライドも何もできないので、逆に自分を入力ファイルとして再読み込みして、評価直後に exit させています。

$ gawk -f yuno.awk
ひだまりスケッチx365 来週も見てくださいね!

問題なく実行はできているようです。

さて、nawk や mawk では /proc/self/cmdline から正常に値が取れませんでしたので、上記スクリプトでは動作しません。 もちろん、引数で自分自身のファイルを与えれば動作するようになるでしょう。

他にも awk で解くスマートな別解があると思いますので、アイデアがあれば教えてください。

追記

ゆの in language にいろいろな言語での解がまとめられています。

awk で最初に考えたのが以下のようなものですが、さすがにダメなのではないかと思って止めました。

$ echo 'X / _ / X < 来週も見てくださいね!' | awk 'sub(/X \/ _ \/ X/, "ひだまりスケッチ×365");'
ひだまりスケッチ×365 < 来週も見てくださいね!

実際にはバレないように同じことをやっているだけです。

tag_gawk.pngtag_gawk.png