Doc*_*ger 10 array awk function
坚持使用 GNU awk 3.1.6 并认为我已经解决了它的数组错误,但在 600 行 awk 程序中仍然存在范围问题。需要验证对 awk 中数组范围的理解才能找到我的错误。
鉴于这个说明性的 awk 代码......
function foo(ga) {
ga[1] = "global result"
}
garray[1] = "global"
foo(garray)
print garray[1]
Run Code Online (Sandbox Code Playgroud)
将打印...
global result
Run Code Online (Sandbox Code Playgroud)
由于数组总是通过引用传递给函数,因此所有数组总是全局的。无法创建本地数组。这样对吗?一直无法找到明确说明这一点的文档。
由于我正在调试,并且 3.1.6 本身在这方面有已知的错误,我试图确定 awk 的错误从哪里停止,我的错误从哪里开始。
补充:为什么 ga[] 在函数内部工作呢?
首先,将数组传递给函数 withfoo(ga)
实际上是不必要的。只需garray[]
在函数内部访问它。然而,这样做并没有可衡量的性能损失,它有助于调试和错误报告。
在使用中foo(ga)
,ga[]
是全局数组的同义词garray[]
。它不是 的本地副本garray[]
,而是简单的指向 的指针garray[]
,就像符号链接是指向文件的指针一样,因此可以使用多个名称访问同一个文件(或数组)。
补充:澄清格伦杰克曼的回答
虽然在函数外部创建的数组对函数来说是全局的,并且可以传递给它或只是在函数内部被引用,但在函数内部创建的数组确实对函数保持局部并且在函数外部不可见。修改杰克曼先生的例子说明了这一点......
awk '
function bar(x,y) {
split("hello world", y)
print "x[1] inside: " x[1]
print "y[1] inside: " y[1]
}
BEGIN {
x[1]="goodbye"
print "x[1] before: " x[1]
print "y[1] before: " y[1]
bar(x)
print "x[1] after: " x[1]
print "y[1] after: " y[1]
}
'
x[1] before: goodbye
y[1] before:
x[1] inside: goodbye
y[1] inside: hello
x[1] after: goodbye
y[1] after:
Run Code Online (Sandbox Code Playgroud)
请注意,我们只是将x[]
数组(实际上,只是一个指向它的指针)传递给bar()
。在y[]
我们进入函数之前,该数组甚至不存在。
但是,如果我们y[]
通过将其包含在bar()
参数列表中而不在函数外部为其分配任何内容来进行声明,则在调用bar(x,y)
...
awk '
function bar(x,y) {
split("hello world", y)
print "x[1] inside: " x[1]
print "y[1] inside: " y[1]
}
BEGIN {
x[1]="goodbye"
print "x[1] before: " x[1]
print "y[1] before: " y[1]
bar(x,y)
print "x[1] after: " x[1]
print "y[1] after: " y[1]
}
'
x[1] before: goodbye
y[1] before:
x[1] inside: goodbye
y[1] inside: hello
x[1] after: goodbye
y[1] after: hello
Run Code Online (Sandbox Code Playgroud)
最后,如果我们y[]
在函数外部创建数组并将其传递给bar(x,y)
,split()
函数内部的赋值将替换该数组的元素......
awk '
function bar(x,y) {
split("hello world", y)
print "x[1] inside: " x[1]
print "y[1] inside: " y[1]
}
BEGIN {
x[1]="goodbye"
y[1]="howdy"
print "x[1] before: " x[1]
print "y[1] before: " y[1]
bar(x,y)
print "x[1] after: " x[1]
print "y[1] after: " y[1]
}
'
x[1] before: goodbye
y[1] before: howdy
x[1] inside: goodbye
y[1] inside: hello
x[1] after: goodbye
y[1] after: hello
Run Code Online (Sandbox Code Playgroud)
函数参数是函数的本地参数。
awk '
function foo(x,y) {y=x*x; print "y in function: "y}
BEGIN {foo(2); print "y out of function: " y}
'
Run Code Online (Sandbox Code Playgroud)
y in function: 4
y out of function:
Run Code Online (Sandbox Code Playgroud)
如果传递给函数的值少于参数的数量,则额外的参数只是空的。您有时可能会看到定义如下的函数
function foo(a, b, c d, e, f) {...
Run Code Online (Sandbox Code Playgroud)
其中空格后面的参数是局部变量,不打算在调用时取值。
没有理由这不能用于本地数组:
awk '
function bar(x) {
split("hello world", x)
print "in: " x[1]
}
BEGIN {
x[1]="world"
bar()
print "out: " x[1]}
'
Run Code Online (Sandbox Code Playgroud)
in: hello
out: world
Run Code Online (Sandbox Code Playgroud)