DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH
 

(gawk.info.gz) Uninitialized Subscripts

Info Catalog (gawk.info.gz) Numeric Array Subscripts (gawk.info.gz) Arrays (gawk.info.gz) Multi-dimensional
 
 Using Uninitialized Variables as Subscripts
 ===========================================
 
    Suppose it's necessary to write a program to print the input data in
 reverse order.  A reasonable attempt to do so (with some test data)
 might look like this:
 
      $ echo 'line 1
      > line 2
      > line 3' | awk '{ l[lines] = $0; ++lines }
      > END {
      >     for (i = lines-1; i >= 0; --i)
      >        print l[i]
      > }'
      -| line 3
      -| line 2
 
    Unfortunately, the very first line of input data did not come out in
 the output!
 
    At first glance, this program should have worked.  The variable
 `lines' is uninitialized, and uninitialized variables have the numeric
 value zero.  So, `awk' should have printed the value of `l[0]'.
 
    The issue here is that subscripts for `awk' arrays are _always_
 strings. Uninitialized variables, when used as strings, have the value
 `""', not zero.  Thus, `line 1' ends up stored in `l[""]'.  The
 following version of the program works correctly:
 
      { l[lines++] = $0 }
      END {
          for (i = lines - 1; i >= 0; --i)
             print l[i]
      }
 
    Here, the `++' forces `lines' to be numeric, thus making the "old
 value" numeric zero. This is then converted to `"0"' as the array
 subscript.
 
    Even though it is somewhat unusual, the null string (`""') is a
 valid array subscript.  (d.c.)  `gawk' warns about the use of the null
 string as a subscript if `--lint' is provided on the command line
 ( Command-Line Options Options.).
 
Info Catalog (gawk.info.gz) Numeric Array Subscripts (gawk.info.gz) Arrays (gawk.info.gz) Multi-dimensional
automatically generated byinfo2html