AWK 基礎知識(その2)

3年ぶりの更新です。。。  すでに「AWKの基礎」は不要になったのでしょうね。申し訳ありません。

それでは始めましょう。
ここでは、制御構文の記述方法のお話をさせてください。(AWKに限ったお話ではありませんが・・・)
AWKの主な制御文には以下があります。

  1. if 文
    条件により異なる処理を行うときに使用します。最も多く使用しますね。
  2. for 文
    繰り返し処理を行えます。最終値までカウントしながらループ処理します。有名なループ制御文ですね。
  3. while 文
    ループ先頭で脱出条件を検査しながら繰り返し処理を行います。
  4. do 文
    ループ末尾で脱出条件を検査しながら繰り返し処理を行います。
各制御文の使い方は参考書などに譲ることとし、ここでは制御構文を記述する際の工夫などをお話しいたします

先ずは、インデントから・・・
ご存じのように、インデントは制御文が入れ子(ネスティング)になる場合などにスクリプトを見易くするための工夫です。
AWKのようにフリーフォーマットでプログラムを記述できる言語ではプログラムの階層構造を見易くするために必須ですね。

インデントにタブを使用する方が多いようですが、私は空白2文字分をインデント幅と決めています。
それもエディタのタブ表示(一般的には8文字分)の文字数を2文字として設定するのではなく、空白文字を2文字打ち込みます。

その理由は簡単です。「AWK 基礎知識(その1)」の章でお話ししたように、私流では「BEGIN」ブロックのみでプログラミングします。
そのため、ちょっとしたデータ集計などのスクリプトでも制御文の階層構造がかなり深くなるのです。
これでは8文字タブをインデントに使用すると長い文字数の行では途中から折り返されて見難くなるのす。
エディタで長い行を折り返さないように設定すると、深い階層構造では横スクロールしなければならず、スクリプトの見通しが悪くなるのです。
参考:
昔(CP/MやDOSの初期の頃)はモニタの横幅が80文字だったので、勝手に80文字で折り返して表示されていました。

・・・と言うことで、私は以下のようにインデント幅を昔から空白2文字として打ち込んでいます。

BEGIN {
  .....
  while (...) {
    if (...) {
      for (i = ...) {
        for (j = ...) {
          .....
        }
      }
    }
  }
}
これをインデントにタブ(8文字)を使用すると・・・
BEGIN {
	.....
	while (...) {
		if (...) {
			for (i = ...) {
				for (j = ...) {
					.....
				}
			}
		}
	}
}
・・・どちらが見易いかは意見の分かれることろでしょう。

8文字タブ・4文字タブ・2文字タブ・・・と使い込んできた私には、最後の2文字が都合良かったのです。
しかも、タブ文字数をエディタに設定して使用すると、他の人にソースを見てもらうときに問題です。
結局、空白文字を2文字打ち込むこととなった次第です。
・・・うぅ〜む。説明が長かったか。。。


次に、ブロックの記述方法です。(簡単に済ませます。。。)

制御文に複数の命令実行させたい時には、{ } で括ってブロックとしなければなりません。
このブロックの記述方法には・・・

if (...) {
  fou (...) {
    ..... (文の並び)
  }
}
・・・と、
if (...)
{
  fou (...)
  {
    ..... (文の並び)
  }
}
・・・のように記述する方法があります。(他にもさまざま・・・)

後者の方が同じ桁位置に { と } があるので、ブロックの範囲を見分け易いですね。
しかし、「AWK 基礎知識(その1)」の章でも解説しましたが、BEGINブロックにはこの記述方法が使えません。
BEGINブロックとBEGINブロック内の制御文のブロックとを使い分けるのはなんとなく気にかかる・・・

そういう訳で、私は昔から前者の記述方法です。(実は、AWK以前にC言語でプログラミングしていたときからです。)
見慣れていることの他に、BEGINブロックの記述方法、そして階層構造が深い場合に行数が少なくて済むことが理由です。

どちらでもお好きな方をお使いあそばせ・・・

<-->

戻る