Skip to content

How to: Avoid Pitfalls

Tobias Bradtke edited this page Jan 22, 2016 · 29 revisions

foo.bar vs. .foo.bar

foo.bar means: call foo and then get the value at the "bar" key of the output(s) of foo.

.foo.bar means: get the value at the "foo" key of . and then get the value at the "bar" key of that.

One character, big difference.

Cartesian Products

jq is geared to produce Cartesian products at the drop of a hat. For example, the expression (1,2) | (3,4) produces four results:

3
4
3
4

To see why:

$ jq -n '(1,2) as $i | (3,4) |  "\($i),\(.)"' 
"1,3"
"1,4"
"2,3"
"2,4"

Generator Expressions in Assignment Right-Hand Sides

Generator expressions in assignment RHS expressions are likely to surprise users. Compare (.a,.b) = (1,2) to (.a,.b) |= (.+1,.*2).

Backtracking (empty) in Assignment RHS Expressions and Reductions.

Ditto. .a=empty and .a|=empty behave differently. 1 | reduce 2 as $stuff (3; empty) produces null, which might be surprising. These behaviors are not well-defined and may change in a future release.

Multi-arity Functions and Comma/Semi-colon Confusability

foo(a,b) is NOT the same as foo(a;b). If foo/1 and foo/2 are defined then you'll silently get the wrong behavior. For example, foo(1,2) is a call to foo/1 with a single argument consisting of the expression 1,2, while foo(1;2) is a call to foo/2 with two arguments: the expressions 1, and 2.

One character, big difference.

Clone this wiki locally