1, 2, 3, 4, 5 .... と無限ループで連続した数字を表示し、Escape キーのような特定のキーで止まるようなプログラムを作りなさい

15 Exercises for Learning a new Programming Language (新しいプログラミング言語を学ぶ際の 15 の練習問題) という記事があります。 ここには新しいプログラミング言語を学ぶ際の 15 の練習問題が書かれてあり、プログラミング言語を学ぶ際の手助けになってくれます。 awk でのこれらの解答を書いておきますので、awk を学ぶ際にお役立てください。

全 15 回で進めていく予定です。

Display series of numbers (1,2,3,4, 5....etc) in an infinite loop. The program should quit if someone hits a specific key (Say ESCAPE key).

「1, 2, 3, 4, 5 .... と無限ループで連続した数字を表示し、Escape キーのような特定のキーで止まるようなプログラムを作りなさい」という問題です。

無限ループ

awk でのループは for 文または while 文で記述でき、無限ループはこの特例のような形で作ることができます。 for 文の場合は、条件を全て省略することで無限ループになります。

for (;;) {
    命令;
}

while 文の場合は、条件を 1 (真) とすることで無限ループになります。

while (1) {
    命令;
}

比較的前者が多く使われているようです。

連続した数字

連続した数字はインクリメント演算子で生成します。

i++;
print i;

ただし、1 行で記述する場合には、インクリメント演算子を先に記述することで 1 からの開始になります。

print ++i;

awk では未定義の変数の初期値は 0 または空列になりますので、i++ とした場合には i を表示した後にインクリメントされることに注意してください。

キーの受付

awk にはキーを受け付ける機能がありません。 shell をうまく使うことで ESC キーを受け付けることもできますが、awk の学習自体の妨げになってしまうため、ここでは Ctrl+C キーで止めるということにしておきます。

解答例

以下に解答例を示しますが、これ以外の解答も多数存在します。 Perl でなくても、"There is more than one way to do it." は全てのプログラムに共通です。

#! /usr/bin/gawk -f
# infinit_loop.awk

BEGIN {
    for (;;) {
        print ++i;
    }
}

実行してみます。

$ gawk -f infinit_loop.awk
1
2
3
4
5
6
7
8
9
10

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png