次の機能を検討してください。
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]=1
awkに配列宣言がないため、配列要素(たとえば)を割り当てる必要があります。 (declare -A
bashと同様の文は使用できません)。
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]
}