オプションの関数引数(配列)の検出

オプションの関数引数(配列)の検出

次の機能を検討してください。

function add_one(in_ar,   each) {
  for (each in in_ar) {
    in_ar[each]++
  }
}

2番目の配列が提供されたら、入力配列を変更する代わりに使用されるように変更したいと思います。私はこれを試しました:

function add_one(in_ar, out_ar,   each) {
  if (out_ar) {
    for (each in in_ar) {
      out_ar[each] = in_ar[each] + 1
    }
  }
  else {
    for (each in in_ar) {
      in_ar[each]++
    }
  }
}
BEGIN {
  split("1 2 3 4 5", q)
  add_one(q, z)
  print z[3]
}

しかし、私は次のような結果を得ます。

fatal: attempt to use scalar `z' as an array

答え1

スクリプトには2つの問題があります。

  • 変数がz初期化されていません。
  • 2番目のコードスニペットのテストは配列に収まりif(out_ar)ません。

最初の問題を解決するには、z[1]=1awkに配列宣言がないため、配列要素(たとえば)を割り当てる必要があります。 (declare -Abashと同様の文は使用できません)。

isarray()GNU awkを使用すると、または関数を介してtypeof()2番目の問題を解決できます。

したがって、コードは次のようになります。

function add_one(in_ar, out_ar,   each) {
  if (isarray(out_ar)) {
    for (each in in_ar) {
      out_ar[each] = in_ar[each] + 1
    }
  }
  else {
    for (each in in_ar) {
      in_ar[each]++
    }
  }
}
BEGIN {
  split("1 2 3 4 5", q)
  z[1]=1
  add_one(q, z)
  print z[3]
}

一度見てください。このページそしてこのページ

関連情報