awkでは、ループを使用して配列を消去して空の配列にすることができます。これは配列を削除するのと同じです。
for (key in array) delete array[key];
より簡単な方法がありますか?変数名をスカラーで再利用できるように配列を完全に削除できますか?
答え1
文法
delete array
現在のバージョンのPOSIXではサポートされていませんが、ほとんどすべての既存の実装(元のawk、GNU、mawk、およびBusyBoxを含む)はこれをサポートしています。 POSIXの将来のバージョンに追加される予定です。欠陥0000544)。
すべての配列要素を消去する代替方法は、split
既存の要素をすべて削除することです。これは移植可能で標準に準拠し、文ではなく式です。
split("", array)
を含むこれらのすべては、delete array
元のawk、GNU awk、およびmawkの変数を配列変数として表示します(BusyBox awkではありません)。私が知っている限り、変数が配列として使用される場合、スカラー変数として使用することはできません。
答え2
これがなぜ良いアイデアなのかはわかりませんが、配列とスカラーと同じ名前を使用し、同じスコープで使用しない場合は、次のようにすることができます.
$ cat tst.awk
BEGIN {
fooIsArray()
foo = 17
print "foo is a scalar:", foo
}
function fooIsArray( foo) {
foo[1] = "bar"
print "foo is an array:", foo[1]
}
$ awk -f tst.awk
foo is an array: bar
foo is a scalar: 17
上記では、foo[]
関数の未使用パラメータとして宣言して関数ローカル変数を作成しましたfooIsArray()
。したがって、スクリプトの他の場所で使用されるグローバルスカラー変数とは関係がなく、配列foo
の内容はfoo[]
関数から返されると削除されます。fooIsArray()
。