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

如何在(g)awk中使用eval语句?,awk,Awk,由于awk似乎没有回调,因此我计划对此使用eval语句。我看了GNU用户指南 然后写了这个简单的脚本 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(

由于awk似乎没有回调,因此我计划对此使用eval语句。我看了GNU用户指南

然后写了这个简单的脚本

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
}
而不是预期的

[~]-> 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."
在eval语句中,感觉好像什么都没有发生。有人知道这里发生了什么吗

gawk版本是4.1.3


Patrik

awk没有任何
eval
关键字

这可以通过gawk
--dump variables
选项进行检查

gawk --dump-variables -f callback.awk
它输出文件
awkvars.out
,您可以在其中找到:

eval: uninitialized scalar

awk没有任何
eval
关键字

这可以通过gawk
--dump variables
选项进行检查

gawk --dump-variables -f callback.awk
它输出文件
awkvars.out
,您可以在其中找到:

eval: uninitialized scalar

这在gawk调试器的文档中。这不是一个正常的呆呆的功能

然而,gawk确实支持调用一个名为
@var(args,…)
符号()的字符串中的函数:

运行时间将打印出来

res=a,b,c
""
请注意,
args[4]
并没有从此修改。发件人:

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


如果您直接传递了参数,并在回调中修改了参数的元素,您将看到反映出来的更改。

这在gawk调试器的文档中。这不是一个正常的呆呆的功能

然而,gawk确实支持调用一个名为
@var(args,…)
符号()的字符串中的函数:

运行时间将打印出来

res=a,b,c
""
请注意,
args[4]
并没有从此修改。发件人:

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


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

++
Nice!我不知道gawk有这么大的才能!我不知道这是可能的。这也是一个比eval更好的解决方案。
++
很好!我不知道gawk有这么大的才能!我不知道这是可能的。这也是一个比eval更好的解决方案。文档中讨论的是
eval awk'..
,而不是
eval
内部
awk
,足以断定
eval
是一个由shell提供并在
awk
内部支持的内置组件。文档中谈到
eval awk'.
而不是
eval
内部
awk
,足以断定
eval
是一个由shell提供并在
awk
内部支持的内置组件