本问题的目的是发布一个规范的答案来解决一个不明显的问题——复制数组中的数组(需要GNU awk支持数组中的数组)。
给定一个数组的数组,如gawk手册中关于遍历数组部分所示:
BEGIN {
a[1] = 1
a[2][1] = 21
a[2][2] = 22
a[3] = 3
a[4][1][1] = 411
a[4][2] = 42
walk_array(a, "a")
}
function walk_array(arr, name, i)
{
for (i in arr) {
if (isarray(arr[i]))
walk_array(arr[i], (name "[" i "]"))
else
printf("%s[%s] = %s\n", name, i, arr[i])
}
}
你要如何编写一个copy_array
函数,能够处理数组的数组,将现有的数组复制到一个新数组中,使得对于新的数组调用walk_array()
函数所输出的结果与原始数组相同。即:
BEGIN {
a[1] = 1
a[2][1] = 21
a[2][2] = 22
a[3] = 3
a[4][1][1] = 411
a[4][2] = 42
walk_array(a, "a")
copy_array(a, b)
print "----------"
walk_array(b, "b")
}
将输出:
a[1] = 1
a[2][1] = 21
a[2][2] = 22
a[3] = 3
a[4][1][1] = 411
a[4][2] = 42
----------
b[1] = 1
b[2][1] = 21
b[2][2] = 22
b[3] = 3
b[4][1][1] = 411
b[4][2] = 42