Gegeben ist ein String, der eine Matrix aus Zahlen darstellt. Gib die Zeilen und Spalten dieser Matrix zurück.
Für einen String mit eingebetteten Zeilenumbrüchen wie diesem:
9 8 7
5 3 2
6 6 7
der diese Matrix darstellt:
1 2 3
|---------
1 | 9 8 7
2 | 5 3 2
3 | 6 6 7
sollte dein Code Folgendes ausgeben können:
Die Zeilen für unsere Beispielmatrix:
Und ihre Spalten:
Dies ist die erste Übung, in der die Lösung kein „main“-Skript ist. Das Ziel ist, eine Bibliothek mit Funktionen zu schreiben, die in andere awk-Programme eingebunden wird. In dieser Übung gibt es mehrere interessante neue Konzepte zu entdecken.
Die folgenden Abschnitte, die mit „(gawk)“ gekennzeichnet sind, sind speziell Erweiterungen von GNU awk.
In dieser Übung liest du Daten aus einer Datei, nicht aus dem Haupteingabestrom.
Lies über getline im Handbuch zu Gnu awk nach,
insbesondere die Formen Getline/File und Getline/Variable/File.
Ein zweidimensionales Array könnte eine Möglichkeit sein, diese Lösung umzusetzen. GNU awk kennt zwei Möglichkeiten, eines darzustellen:
Beachte die @include-Direktive in der Testdatei.
Sie weist gawk an, die genannte Datei zu lesen und auszuwerten.
Alle awk-Variablen sind global (außer Funktionsparametern, die lokal für die Funktion sind).
Es besteht ein hohes Risiko für Namenskollisionen, besonders wenn Bibliotheken von Drittanbietern eingebunden werden.
Mit Namensräumen lässt sich aufteilen, wo Variablen gespeichert werden.
Beachte die @namespace-Direktive in den Dateien der Übung.
Der Standard-Namensraum heißt „awk“. Ein Standard-Namensraum ermöglicht es, aus einer Funktion in einem anderen Namensraum heraus eine eingebaute awk-Funktion aufzurufen.
Array-Parameter werden per Referenz übergeben. Änderungen am Array, die in der Funktion vorgenommen werden, sind beim Aufrufer sichtbar.
Nicht-Array-Parameter werden per Wert übergeben.
Bei untypisierten Parametern hängt es davon ab, was die Funktion mit ihnen macht:
Alle Details stehen im Handbuch unter Passing Function Arguments by Value Or by Reference.
Funktionslokale (lokale) Variablen lassen sich mit Parametern erzeugen, die „pass by value“ übergeben werden. Es ist kein Fehler, einer Funktion weniger Werte zu übergeben, als Parameter aufgeführt sind; die überzähligen Parameter sind „untypisiert“, bis sie verwendet werden. Ihnen können in der Funktion skalare Werte zugewiesen werden, die nicht im globalen Namensraum gespeichert werden.
Üblicherweise stehen in der Funktionssignatur zuerst die erwarteten Parameter, gefolgt von etwas Leerraum und dann den lokalen Parametern. Ein Beispiel:
function add(a, b, total) {
# here, `typeof(total)` is "untyped"
total = a + b
# now, `typeof(total)` is "number"
return total
}
BEGIN {
sum = add(5, 10)
print sum # 15
print typeof(total) # untyped, meaning "total" is unused in this scope
}
Melde dich bei Exercism an, um AWK mit 3 Konzepte92 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.