由于 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 帕特里克
那是在 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在回调中直接传递并修改了它的元素,您会看到所反映的更改。