在 awk 中,函数定义何时执行?
函数定义是否在执行之前BEGIN {...}
执行?谢谢。
答案1
这很容易确定;我很好奇,并决定首先测试“最坏情况”,通过在 awk 脚本文件末尾定义函数:
$ cat go.awk
BEGIN {
print "The BEGIN block is executing"
print reverse("The BEGIN block is executing")
}
{
print reverse($0)
}
function reverse(str) {
trs=""
for(i=length(str); i > 0; i--) {
trs=trs substr(str, i, 1);
}
return trs
}
与:
$ cat input
line one
line two
line three
...结果是:
$ awk -f go.awk < input
The BEGIN block is executing
gnitucexe si kcolb NIGEB ehT
eno enil
owt enil
eerht enil
您可以看到该函数是在输入 BEGIN 块之前定义的(函数“定义”已“执行”),因为 BEGIN 块成功调用了我的用户定义reverse
函数。
看到这个函数没有被处决当它被定义时,只需print
在函数内插入一条语句,并观察该语句没有输出,直到函数被定义为止。被称为。
这awk 的 POSIX 规范最中肯地说:
函数可以在 awk 程序中的任何位置引用;特别是,它的使用可以先于它的定义。函数的作用域是全局的。
这gawk 手册页暗示着类似的事情:
... Gawk 读取程序文本,就好像所有程序文件和命令行源文本都连接在一起一样。这对于构建 AWK 函数库非常有用,而不必将它们包含在每个使用它们的新 AWK 程序中。它还提供了将库函数与命令行程序混合的能力。
...
Gawk 按以下顺序执行 AWK 程序。首先,执行通过 -v 选项指定的所有变量分配。接下来,gawk 将程序编译成内部形式。然后,gawk 执行 BEGIN 规则中的代码(如果有),然后继续...