An important aspect of arrays to remember is that array subscripts are always strings. If you use a numeric value as a subscript, it will be converted to a string value before it is used for subscripting (see section Conversion of Strings and Numbers).
This means that the value of the built-in variable CONVFMT
can potentially
affect how your program accesses elements of an array. For example:
xyz = 12.153 data[xyz] = 1 CONVFMT = "%2.2f" if (xyz in data) printf "%s is in data\n", xyz else printf "%s is not in data\n", xyz
This prints `12.15 is not in data'. The first statement gives
xyz
a numeric value. Assigning to
data[xyz]
subscripts data
with the string value "12.153"
(using the default conversion value of CONVFMT
, "%.6g"
),
and assigns one to data["12.153"]
. The program then changes
the value of CONVFMT
. The test `(xyz in data)' generates a new
string value from xyz
, this time "12.15"
, since the value of
CONVFMT
only allows two significant digits. This test fails,
since "12.15"
is a different string from "12.153"
.
According to the rules for conversions
(see section Conversion of Strings and Numbers), integer
values are always converted to strings as integers, no matter what the
value of CONVFMT
may happen to be. So the usual case of:
for (i = 1; i <= maxsub; i++) do something with array[i]
will work, no matter what the value of CONVFMT
.
Like many things in awk
, the majority of the time things work
as you would expect them to work. But it is useful to have a precise
knowledge of the actual rules, since sometimes they can have a subtle
effect on your programs.
Go to the first, previous, next, last section, table of contents.