在 awk 中,函数定义何时执行?

在 awk 中,函数定义何时执行?

在 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 规则中的代码(如果有),然后继续...

相关内容