2010年4月20日火曜日

ローカル変数を使う方法 - AWK

AWKのパターンと制御文
AWKプログラムを書く
○Gawk on Windows ○Gawk ○mawk32 ○Mawk ○awk
AWKの変数は、関数の引数以外はグローバル変数です。
ローカル変数が欲しい時は、関数の引数の後ろに、使いたい変数を追加します。

**** グローバル変数とローカル変数の違い
o グローバル変数は、ブログラムのどこからでも更新出来る変数です。
   + AWKの変数は、基本的にグローバル変数です。
o ローカル変数は、括弧の中でだけ有効な変数。部品を作る時に便利です。
o ローカル変数の直前は、多めに空けておく事が推奨されているみたいです。
   + 理由は、実際に必要な引数と明確に区別する為です。

**** 例1. ローカル変数 tmp1を使う方法
----------------
function f(v1, v2,    tmp1) { # ローカル変数の前を空けるのは、AWK界の慣習みたいです。
  tmp1 = v1 * v2;
}
{
  tmp1 = 10;
  f(2, 3);
  print "tmp1の値は " tmp1 " です。"; # 10のままです。
}
----------------

**** 例2. 関数の引数にしなかった時の動作
  どこかで、同じ名前の変数を使っていると、その値が上書きされます。
----------------
function f(v1, v2) {
  tmp1 = v1 * v2;
}
{
  tmp1 = 10;
  f(2, 3);
  print "tmp1の値は " tmp1 " です。"; # 上書きされて 6になります。
}
----------------


**** 確認した処理系
o Gawk on Windows 3.1.7
o Gawk for Windows 3.1.6
o mawk MBCS (32bit版) 1.3.3
o Mawk for Windows 1.3.3
o original = the one true awk(updated May 1, 2007)


==
関連ページ:
    ▼AWKのパターンと制御文▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > AWKプログラム実行時に変数を設定する方法
    AWKで入力ファイルの指定を不要にする
    > ▼AWKの関数、変数、制御文(目的別)
    +
    AWKの入力ファイルを、AWKプログラムの中で追加、削除(= キャンセル)する
(2010年8月2日追加。ローカル変数を使う時の慣習)

文字列を組み立てる方法 - AWK

AWKの文字列操作関数と関連機能
AWKプログラムを書く
文字列を組み立てる時は、変数などをそのまま並べる方法が簡単です。
書式付きで組み立てたい時は、sprintfを使う方法が簡単です。

# 特に、Gawk on Windows 3.1.7の場合、変数をそのまま並べた方が、速いです。
# 詳しくは、下のメモ欄をどうぞ。
#

**** 例1。並べて書く場合の書き方
--------
{
  v = "1番目の文字は「" $1 "」です。";
  print v;
  v = "2番目と3番目の文字は「" $2 "」と「" $3 "」です。";
  print v;

  # print文で直接書く事も出来ます。
  # print "2番目と3番目の文字は「" $2 "」と「" $3 "」です。";
}
--------


**** 例2。sprintf関数を使った場合の書き方
--------
{
  v = sprintf("1番目の文字は「%s」です。", $1);
  print v;
  v = sprintf("2番目と3番目の文字は「%s」と「%s」です。", $2, $3);
  print v;
}
--------

o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。


**** メモ
o sprintfの書式について。%sの他に、%dなどもあります。
o 書式はC言語のsprintfと同じに見えますが、若干、出来る事が少ないみたいです。試しながら使います。
   + %s = 文字列として扱います。
   + %d = 整数として扱います。
o 実行速度について
   + Gawk on Windows(3.1.7) で比較した時、そのまま並べる方が 9倍程度高速でした。
   + というよりも、sprintfが 9倍程度遅いといった方が正しいかもしれません。
   + 反対に、mawk MBCS (32bit版)(1.3.3) で比較した時は、sprintfの方がわずかに速かったです。
   + (性能調査結果はこちら)


==
関連ページ:
    ▼AWKの文字列操作関数と関連機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > 文字列から文字を1つずつ取り出す
    文字列中で使用出来る特殊文字
    > プログラムの基本パターン
    ローカル変数を使う
(2010年8月16日追加。print文で直接書く事も可能)
(2010年8月9日変更。おすすめ手順を上に移動)
(2010年4月28日追加。単純に文字を並べる場合)

to_dkのzoome日記ご覧の方へ - お知らせなど

お知らせなど
投稿サイト zoome で公開していた制作メモのほとんどは、このブログに移行しました。
右側に並んでいる目次から辿る事が出来ます。

o このサイトにある制作メモは、こちら
o to_dk@wikiにある制作メモ別館は、▽http://www28.atwiki.jp/to_dk/pages/55.html


==
関連ページ:
    ▼お知らせなど
    ▼目次
    >> ▼制作メモ