在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()
。