Mit Listen arbeiten
Listen erstellen
Eine Liste ist eine geordnete Sammlung von Werten. Erstellt wird eine list
mit eckigen Klammern, in denen die Werte durch Leerzeichen und/oder Kommas getrennt werden, zur besseren Lesbarkeit. Zum Beispiel, [foo bar baz]
oder [foo, bar, baz]
,
Listen updaten
Mit den zwei Befehlen update
und insert
können Listen in einer Pipeline verändert werden, zum Beispiel fügt folgende Zeile den Wert 10
in der Mitte, also an Stelle 2 ein.
> [1, 2, 3, 4] | insert 2 10
# [1, 2, 10, 3, 4]
Mit dem Befehl update
ersetzen wir hingegen das 2. Element mit dem Wert 10
.
> [1, 2, 3, 4] | update 1 10
# [1, 10, 3, 4]
Zusätzlich zu insert
und update
stehen die Befehle prepend
und append
zu Verfügung. Diese fügen Werte am Anfang einer Liste oder am Ende ein.
Zum Beispiel:
let colors = [yellow green]
let colors = ($colors | prepend red)
let colors = ($colors | append purple)
echo $colors # [red yellow green purple]
Durch Listen iterieren
Um durch eine Liste zu iterieren, wird der each
Befehl vewendet, dem ein block mit Nu-Code folgt, der auf jedes Element der Liste angewendet wird. Der Block Parameter (z.B. |elt|
in { |elt| echo $elt }
) entspricht normalerweise dem Element der Liste, was jedoch mit dem --numbered
(-n
) Flag geändert werden kann in die zwei Parameter index
und item
. zum Beispiel:
let names = [Mark Tami Amanda Jeremy]
$names | each { |elt| $"Hello, ($elt)!" }
# Outputs "Hello, Mark!" and three more similar lines.
$names | enumerate | each { |elt| $"($elt.index + 1) - ($elt.item)" }
# Outputs "1 - Mark", "2 - Tami", etc.
Der where
Befehl kann verwendet werden um einen Filter auf eine Liste anzuwenden. Das folgende Beispiel gibt alle Farben zurück, deren Namen auf "e" enden.
let colors = [red orange yellow green blue purple]
echo $colors | where ($it | str ends-with 'e')
In diesem Beispiel werden nur Werte behalten, die höher als 7
sind.
# The block passed to where must evaluate to a boolean.
# This outputs the list [orange blue purple].
let scores = [7 10 8 6 7]
echo $scores | where $it > 7 # [10 8]
Der reduce
Befehl berechnet einen einfachen Wert aus einer Liste. Der darauffolgende Block enthält 2 Parameter: Das momentane Element (üblicherweise elt
genannt) und einen Sammler (Akkumulator) (üblicherweise acc
). Um einen initialen Wert für den Akkumulator zu setzen, wird das --fold
(-f
) Flag gesetzt. Um den Iterator elt
zu ändern nach index
und item
, wird wiederum das --numbered
(-n
) Flag verwendet. Zum Beispiel:
let scores = [3 8 4]
echo "total =" ($scores | reduce { |elt, acc| $acc + $elt }) # 15
echo "total =" ($scores | math sum) # easier approach, same result
echo "product =" ($scores | reduce --fold 1 { |elt, acc| $acc * $elt }) # 96
echo $scores | reduce -n { |elt, acc| $acc.item + $elt.index * $elt.item } # 3 + 1*8 + 2*4 = 19
Auf Listen zugreifen
Um auf ein Element einer Liste zuzugreifen, wird $name.index
verwendet, wobei in der $name
Variablen eine Liste enthalten sein muss. Zum Beispiel kann in folgender Liste das 2. Element mit $names.1
verwendet werden.
let names = [Mark Tami Amanda Jeremy]
$names.1 # gives Tami
Wenn der Index in einer Variablen wie $index
enthalten ist, kann dieser mit dem get
Befehl extrahiert werden.
let names = [Mark Tami Amanda Jeremy]
let index = 1
$names | get $index # gives Tami
Der length
Befehl gibt die Anzahl Elemente in der Liste zurück. Zum Beispiel, [red green blue] | length
ergibt 3
.
Der is-empty
Befehl ermittelt, ob ein String, eine Liste oder eine Tabelle leer ist. Mit einer Liste wird er so verwendet:
let colors = [red green blue]
$colors | is-empty # false
let colors = []
$colors | is-empty # true
Der in
und not-in
Operator wird verwendet, um zu testen, ob ein Wert in einer Liste vorhanden ist oder nicht. Zum Beispiel:
let colors = [red green blue]
'blue' in $colors # true
'yellow' in $colors # false
'gold' not-in $colors # true
Der any
Befehl ermittelt, ob irgend ein Element der Liste einer Bedingung entspricht. Zum Beispiel:
# Do any color names end with "e"?
$colors | any {|elt| $elt | str ends-with "e" } # true
# Is the length of any color name less than 3?
$colors | any {|elt| ($elt | str length) < 3 } # false
# Are any scores greater than 7?
$scores | any {|elt| $elt > 7 } # true
# Are any scores odd?
$scores | any {|elt| $elt mod 2 == 1 } # true
Der all
Befehl wiederum ermittelt, ob jedes Element der Liste einer Bedingung entspricht. Zum Beispiel:
# Do all color names end with "e"?
$colors | all {|elt| $elt | str ends-with "e" } # false
# Is the length of all color names greater than or equal to 3?
$colors | all {|elt| ($elt | str length) >= 3 } # true
# Are all scores greater than 7?
$scores | all {|elt| $elt > 7 } # false
# Are all scores even?
$scores | all {|elt| $elt mod 2 == 0 } # false
Eine Liste konvertieren
Der flatten
Befehl generiert aus einer bestehenden Liste eine neue Liste, indem eine verschachtelte Liste in die Top-Level Liste integriert werden. Dies kann mehrere Male aufgerufen werden, um verschachtelte Listen jeglicher Tiefe zu integrieren. Zum Beispiel:
echo [1 [2 3] 4 [5 6]] | flatten # [1 2 3 4 5 6]
echo [[1 2] [3 [4 5 [6 7 8]]]] | flatten | flatten | flatten # [1 2 3 4 5 6 7 8]
Der wrap
Befehl konvertiert eine Liste in eine Tabelle. Jedes Listen-Element wird in eine eigene Zeile mit einer einzigen Spalte überführt.
let zones = [UTC CET Europe/Moscow Asia/Yekaterinburg]
# Show world clock for selected time zones
$zones | wrap 'Zone' | upsert Time {|row| (date now | date to-timezone $row.Zone | format date '%Y.%m.%d %H:%M')}