如何在 (g)awk 中使用 eval 语句?

pat*_*rik 1 awk

由于 awk 似乎没有回调,我打算为此使用 eval 语句。所以我查看了 GNU 用户指南,

https://www.gnu.org/software/gawk/manual/html_node/Viewing-And-Changing-Data.html

然后写了这个简单的脚本。

BEGIN {
    args[1]="\"a\""
    args[2]="\"b\""
    args[3]="\"c\""
    args[4]="\"\""
    run_callback("printargs",args)
    print args[4]
}
function run_callback(callback,args)
{
    nargs=length(args)
    if (nargs>0)
    {   
        argstring=args[1]
        for (argn=2;argn<=nargs;argn++)
        {
            argstring=argstring","args[argn]
        }
    }   
    callbackstr = callback"("argstring")"
    print callbackstr
    eval callbackstr
}
function printargs(arg1,arg2,arg3,res)
{
    res=arg1","arg2","arg3
    print "res="res
}
Run Code Online (Sandbox Code Playgroud)

但是,打印输出不是我所期望的。我明白了,

[~]-> gawk -f callback.awk
printargs(a,b,c,"")
""
Run Code Online (Sandbox Code Playgroud)

而不是预期的,

[~]-> gawk -f callback.awk
printargs(a,b,c,"")
res=a,b,c
"Not sure what is supposed to be here, but it is not relevant."
Run Code Online (Sandbox Code Playgroud)

感觉好像在 eval 语句中没有实际发生任何事情。有谁知道这里发生了什么?

gawk 版本是 4.1.3

BR 帕特里克

Sha*_*awn 5

那是在 gawk debugger的文档中。这不是正常的gawk 功能。

但是,gawk确实支持调用名称在带有@var(args,...)符号的字符串中的函数(文档中的更多信息):

BEGIN {
    args[1]="a"
    args[2]="b"
    args[3]="c"
    args[4]="\"\""
    run_callback("printargs",args[1],args[2],args[3],args[4])
    print args[4]
}
function run_callback(callback,arg1,arg2,arg3,res)
{
    @callback(arg1,arg2,arg3,res);
}
function printargs(arg1,arg2,arg3,res)
{
    res=arg1","arg2","arg3
    print "res="res
}
Run Code Online (Sandbox Code Playgroud)

什么时候运行会打印出来

res=a,b,c
""
Run Code Online (Sandbox Code Playgroud)

请注意,这args[4]不是从这里修改的。从函数参数传递约定的文档中

相反,传递约定是在调用函数时在运行时确定的,根据以下规则:如果参数是数组变量,则通过引用传递。否则,参数按值传递。

如果您args在回调中直接传递并修改了它的元素,您会看到所反映的更改。