2010年10月1日金曜日

配列を代入、コピーする方法 - AWK

AWKの配列操作関数と関連機能
○Gawk on Windows ○Gawk ○mawk32 ○Mawk ○awk
AWKの配列は、直接代入する事は出来ません。
代入したい時は、要素を1つずつコピーします。良く使う時は、関数にすると便利です。


**** 対応例
o 失敗する例
--------
BEGIN {
  a[1] = "ミクさん";
  a[2] = "ネギ";
  b = a; # この時点で、エラーになります。
  print b[1];
}
--------


o 正しく動作する例
--------
BEGIN {
  a[1] = "ミクさん";
  a[2] = "ネギ";
  for (i in a) {
    b[i] = a[i];
  }
  print b[1]; # 結果は「ミクさん」
}
--------


o 関数にした例
--------
function acopy(a1, a2,    i) { # 関数名や引数の順序はお好きにどうぞ
  for (i in a1) {
    a2[i] = a1[i];
  }
}
BEGIN {
  a[1] = "ミクさん";
  a[2] = "ネギ";
  acopy(a, b);
  print b[1]; # 結果は「ミクさん」
}
--------

o C言語好きな方の場合、acopy(b, a);の形の方が使い易いかもしれません。
o C言語の標準ライブラリの書式は、代入先を先に書く形になっていましたから。


**** メモ
o 配列は、代入する事は出来ませんが、関数の引数として渡す事は出来ます。
o f(a);の形で呼び出した時、配列a の要素はコピーされず、配列aを別名で操作するような形になります。
--------
function f(a) {
  a[1] = "39さん";
}
BEGIN {
  a[1] = "ミクさん";
  a[2] = "ネギ";
  f(a);
  print a[1]; # 結果は「39さん」
}
--------



**** 確認した処理系
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
    ▼制作メモ
    > length = 文字列や配列の長さを調べる
    delete = 配列の要素を削除する
    asort = 配列の要素を並び替える(Gawk専用)
    +
    配列を使う時の注意点まとめ