我正在使用 GNU Awk 5.1.0,API:3.0 并具有以下 awk 脚本。测试表明,永远不能使用函数参数来更改用作其输入的变量。因此,在下面的示例中,我们得到p: 21
.这意味着只要将变量作为参数传递给函数,我就无法在函数终止后将其更改为其他内容。它是否正确?
awk '
function solarex_nuclmn(e) {
e = 34
}
BEGIN {
p = 21
solarex_nuclmn(p)
print "p: " p
}
'
p: 34
我知道我可以使用 来获取值return e
。
awk '
function solarex_nuclmn(e) {
e = 34
return e
}
BEGIN {
p = 21
p = solarex_nuclmn()
print "p: " p
}
'
然后就有可能使用全局变量。尽管大多数时候人们希望避免使用全局变量。
awk '
function solarex_nuclmn(e) {
G = 34
}
BEGIN {
G = 21
solarex_nuclmn()
print "G: " G
}
'
最后可以使用数组
awk '
function solarex_nuclmn(a) {
a[0] = 34
}
BEGIN {
a[0] = 21
solarex_nuclmn(a)
print "a[0]: " a[0]
}
'
仅此而已。没有其他的可能性p: 34
,对吗?使用return
、global
或array
。要更改多个值,最好的方法是将数组作为参数传递(因为可以更改数组元素值并添加其他数组元素)。
我正在寻找一种可移植的方法,让函数可以更改函数范围之外的值。但如果有什么关于 GAWK 的具体内容,我也想听听。
答案1
我不确定您在寻找什么,但这里有 GNU awk 中函数的 3 种用法,显示了参数和返回值的典型用法:
function f(a,b){ return a+b; }
function g(a,b){ A=a; B=b; }
function h(a,b){ SYMTAB[a] = SYMTAB[b]; }
BEGIN{
A=99; B=88; a=77; b=66;
x=f(1,2); print "x=" x
g(4,5); print "A=" A, "B=" B
h("A","B"); print "A=" A
}
f()
返回一个值,因此它可以用在表达式和赋值中,例如
x=f(1,2)
.g()
设置全局变量A
和B
.它们是全局变量,因为它们不在参数列表中a,b
。 h()
实现了一种叫名字,其中全局名称作为字符串传入,并且该名称的全局变量通过 GNU 内置SYMTAB
符号表访问。这会产生输出
x=3
A=4 B=5
A=5