mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-23 07:59:37 +00:00
* Update index.md.in * more copy-editing * swipes.sh * swipes.sh * run `make docs` to generate `*.md` from `*.md.in`
100 lines
4.2 KiB
Markdown
100 lines
4.2 KiB
Markdown
# DSL operators
|
|
|
|
## Detailed listing
|
|
|
|
Operators are listed on the [DSL built-in functions page](reference-dsl-builtin-functions.md).
|
|
|
|
## Operator precedence
|
|
|
|
Operators are listed in order of decreasing precedence, from highest to lowest.
|
|
|
|
| Operators | Associativity |
|
|
|-------------------------------|---------------|
|
|
| `()` `{}` `[]` | left to right |
|
|
| `**` | right to left |
|
|
| `???` | left to right |
|
|
| `??` | left to right |
|
|
| `!` `~` unary`+` unary`-` | right to left |
|
|
| `.` | left to right |
|
|
| `*` `/` `//` `%` | left to right |
|
|
| binary`+` binary`-` | left to right |
|
|
| `<<` `>>` `>>>` | left to right |
|
|
| `&` | left to right |
|
|
| `^` | left to right |
|
|
| `|` | left to right |
|
|
| `<` `<=` `>` `>=` | left to right |
|
|
| `==` `!=` `=~` `!=~` `<=>` | left to right |
|
|
| `&&` | left to right |
|
|
| `^^` | left to right |
|
|
| `||` | left to right |
|
|
| `? :` | right to left |
|
|
| `=` | N/A for Miller (there is no $a=$b=$c) |
|
|
|
|
See also the [section on parsing and operator precedence in the REPL](repl.md#parsing-and-operator-precedence) for information on how to examine operator precedence interactively.
|
|
|
|
## Operator and function semantics
|
|
|
|
* Functions are often pass-throughs straight to the system-standard Go libraries.
|
|
|
|
* The [`min`](reference-dsl-builtin-functions.md#min) and [`max`](reference-dsl-builtin-functions.md#max) functions are different from other multi-argument functions, which return null if any of their inputs are null: for [`min`](reference-dsl-builtin-functions.md#min) and [`max`](reference-dsl-builtin-functions.md#max), by contrast, if one argument is absent-null, the other is returned. Empty-null loses min or max against numeric or boolean; empty-null is less than any other string.
|
|
|
|
* Symmetrically with respect to the bitwise OR, AND, and XOR operators
|
|
[`|`](reference-dsl-builtin-functions.md#bitwise-or),
|
|
[`&`](reference-dsl-builtin-functions.md#bitwise-and), and
|
|
[`^`](reference-dsl-builtin-functions.md#bitwise-xor), Miller has logical operators
|
|
[`||`](reference-dsl-builtin-functions.md#logical-or),
|
|
[`&&`](reference-dsl-builtin-functions.md#logical-and), and
|
|
[`^^`](reference-dsl-builtin-functions.md#logical-xor).
|
|
|
|
* The exponentiation operator [`**`](reference-dsl-builtin-functions.md#exponentiation) is familiar from many languages, except that an integer raised to an int power is int, not float.
|
|
|
|
* The regex-match and regex-not-match operators [`=~`](reference-dsl-builtin-functions.md#regmatch) and [`!=~`](reference-dsl-builtin-functions.md#regnotmatch) are similar to those in Ruby and Perl.
|
|
|
|
## The double-purpose dot operator
|
|
|
|
The main use for the `.` operator is for string concatenation: `"abc" . "def"` is `"abc.def"`.
|
|
|
|
However, in Miller 6, it has an optional use for map traversal. Example:
|
|
|
|
GENMD-RUN-COMMAND
|
|
cat data/server-log.json
|
|
GENMD-EOF
|
|
|
|
GENMD-RUN-COMMAND
|
|
mlr --json --from data/server-log.json put -q '
|
|
print $req["headers"]["host"];
|
|
print $req.headers.host;
|
|
'
|
|
GENMD-EOF
|
|
|
|
This also works on the left-hand sides of assignment statements:
|
|
|
|
GENMD-RUN-COMMAND
|
|
mlr --json --from data/server-log.json put '
|
|
$req.headers.host = "UPDATED";
|
|
'
|
|
GENMD-EOF
|
|
|
|
A few caveats:
|
|
|
|
* This is why `.` has higher precedence than `+` in the table above -- in Miller 5 and below, where `.` was only used for concatenation, it had the same precedence as `+`. So you can now do this:
|
|
|
|
GENMD-RUN-COMMAND
|
|
mlr --json --from data/server-log.json put -q '
|
|
print $req.id + $res.status_code
|
|
'
|
|
GENMD-EOF
|
|
|
|
* However (awkwardly), if you want to use `.` for map-traversal as well as string-concatenation in the same statement, you'll need to insert parentheses, as the default associativity is left-to-right:
|
|
|
|
GENMD-RUN-COMMAND
|
|
mlr --json --from data/server-log.json put -q '
|
|
print $req.method . " -- " . $req.path
|
|
'
|
|
GENMD-EOF
|
|
|
|
GENMD-RUN-COMMAND
|
|
mlr --json --from data/server-log.json put -q '
|
|
print ($req.method) . " -- " . ($req.path)
|
|
'
|
|
GENMD-EOF
|