通过 awk 函数调用设置值

通过 awk 函数调用设置值

我正在使用 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,对吗?使用returnglobalarray。要更改多个值,最好的方法是将数组作为参数传递(因为可以更改数组元素值并添加其他数组元素)。

我正在寻找一种可移植的方法,让函数可以更改函数范围之外的值。但如果有什么关于 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()设置全局变量AB.它们是全局变量,因为它们不在参数列表中a,bh()实现了一种叫名字,其中全局名称作为字符串传入,并且该名称的全局变量通过 GNU 内置SYMTAB符号表访问。这会产生输出

x=3
A=4 B=5
A=5

相关内容