|
|
1.1 root 1: Nov 30, 1979:
2:
3: Awk has been modified yet again, in an attempt to make
4: its behavior more rational and predictable in the areas
5: of initialization, comparison, and type coercion.
6: Herewith what we believe the current truth to be:
7:
8: 1. Each variable and field can potentially be a string
9: or a number or both at any time.
10: When a variable is set by the assignment
11: v = expr
12: its type is set to that of expr. (This includes +=, ++, etc.)
13: An arithmetic expression is of type number, a
14: concatenation is of type string, and so on.
15:
16: If the assignment is a simple copy, as in
17: v1 = v2
18: then the type of v1 becomes that of v2.
19:
20: 2. In comparisons, if both operands are numeric,
21: the comparison is made numerically. Otherwise,
22: operands are coerced to string if necessary, and
23: the comparison is made on strings.
24:
25: 3. The type of any expression can be coerced to
26: numeric by subterfuges (kludges?) such as
27: expr + 0
28: and to string by
29: expr ""
30: (i.e., concatenation with a null string).
31:
32: 4. Uninitialized variables have the numeric value
33: 0 and the string value "". Accordingly, if x is
34: uninitialized,
35: if (x) ...
36: is false, and
37: if (!x) ...
38: if (x == 0) ...
39: if (x == "") ...
40: are all true. But note that
41: if (x == "0") ...
42: is false.
43:
44: 5. The type of a field is determined by context
45: when possible; for example,
46: $1++
47: clearly implies that $1 is to be numeric, and
48: $1 = $1 "," $2
49: implies that $1 and $2 are both to be strings.
50: Coercion will be done as needed.
51:
52: In contexts where types cannot be reliably determined, e.g.,
53: if ($1 == $2) ...
54: the type of each field is determined on input by
55: inspection. All fields are strings; in addition,
56: each field that contains only a number (in the
57: sense of Fortran, say) is also considered numeric.
58: This ensures (for better or worse) that the test
59: if ($1 == $2) ...
60: will succeed on the inputs
61: 0 0.0
62: 100 1e2
63: +100 100
64: 1e-3 1e-3
65: and fail on the inputs
66: (null) 0
67: (null) 0.0
68: 2E-518 6E-427
69: as we believe it should.
70:
71: Fields which are explicitly null have the string
72: value ""; they are not numeric.
73: Non-existent fields (i.e., fields past NF) are
74: treated this way too.
75:
76: As it is for fields, so it is for array elements
77: created by split(...).
78:
79: 6. There is no warranty of merchantability nor any warranty
80: of fitness for a particular purpose nor any other warranty,
81: either express or implied, as to the accuracy of the
82: enclosed materials or as to their suitability for any
83: particular purpose. Accordingly, the AWK Development
84: Task Force assumes no responsibility for their use by the
85: recipient. Further, the Task Force assumes no obligation
86: to furnish any assistance of any kind whatsoever, or to
87: furnish any additional information or documentation.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.