gawk: Variable Scope

 
 9.2.3.2 Controlling Variable Scope
 ..................................
 
 Unlike in many languages, there is no way to make a variable local to a
 '{' ... '}' block in 'awk', but you can make a variable local to a
 function.  It is good practice to do so whenever a variable is needed
 only in that function.
 
    To make a variable local to a function, simply declare the variable
 as an argument after the actual function arguments (SeeDefinition
 Syntax).  Look at the following example, where variable 'i' is a
 global variable used by both functions 'foo()' and 'bar()':
 
      function bar()
      {
          for (i = 0; i < 3; i++)
              print "bar's i=" i
      }
 
      function foo(j)
      {
          i = j + 1
          print "foo's i=" i
          bar()
          print "foo's i=" i
      }
 
      BEGIN {
            i = 10
            print "top's i=" i
            foo(0)
            print "top's i=" i
      }
 
    Running this script produces the following, because the 'i' in
 functions 'foo()' and 'bar()' and at the top level refer to the same
 variable instance:
 
      top's i=10
      foo's i=1
      bar's i=0
      bar's i=1
      bar's i=2
      foo's i=3
      top's i=3
 
    If you want 'i' to be local to both 'foo()' and 'bar()', do as
 follows (the extra space before 'i' is a coding convention to indicate
 that 'i' is a local variable, not an argument):
 
      function bar(    i)
      {
          for (i = 0; i < 3; i++)
              print "bar's i=" i
      }
 
      function foo(j,    i)
      {
          i = j + 1
          print "foo's i=" i
          bar()
          print "foo's i=" i
      }
 
      BEGIN {
            i = 10
            print "top's i=" i
            foo(0)
            print "top's i=" i
      }
 
    Running the corrected script produces the following:
 
      top's i=10
      foo's i=1
      bar's i=0
      bar's i=1
      bar's i=2
      foo's i=1
      top's i=10
 
    Besides scalar values (strings and numbers), you may also have local
 arrays.  By using a parameter name as an array, 'awk' treats it as an
 array, and it is local to the function.  In addition, recursive calls
 create new arrays.  Consider this example:
 
      function some_func(p1,      a)
      {
          if (p1++ > 3)
              return
 
          a[p1] = p1
 
          some_func(p1)
 
          printf("At level %d, index %d %s found in a\n",
               p1, (p1 - 1), (p1 - 1) in a ? "is" : "is not")
          printf("At level %d, index %d %s found in a\n",
               p1, p1, p1 in a ? "is" : "is not")
          print ""
      }
 
      BEGIN {
          some_func(1)
      }
 
    When run, this program produces the following output:
 
      At level 4, index 3 is not found in a
      At level 4, index 4 is found in a
 
      At level 3, index 2 is not found in a
      At level 3, index 3 is found in a
 
      At level 2, index 1 is not found in a
      At level 2, index 2 is found in a