Matrix

Matrix

Mittel

Anleitung

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:

  • Eine Liste der Zeilen, wobei du jede Zeile von links nach rechts liest und dich dabei von oben nach unten über die Zeilen bewegst,
  • Eine Liste der Spalten, wobei du jede Spalte von oben nach unten liest und dich dabei von links nach rechts bewegst.

Die Zeilen für unsere Beispielmatrix:

  • 9, 8, 7
  • 5, 3, 2
  • 6, 6, 7

Und ihre Spalten:

  • 9, 5, 6
  • 8, 3, 6
  • 7, 2, 7

Neue AWK-Konzepte

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.

Aus einer Datei lesen

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.

Mehr über Arrays

Ein zweidimensionales Array könnte eine Möglichkeit sein, diese Lösung umzusetzen. GNU awk kennt zwei Möglichkeiten, eines darzustellen:

Include-Dateien (gawk)

Beachte die @include-Direktive in der Testdatei.
Sie weist gawk an, die genannte Datei zu lesen und auszuwerten.

Namensräume (gawk)

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.

Wie Funktionsparameter übergeben werden

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:

  • Wenn die Funktion ihn als Array initialisiert, wird er zu einem Parameter, der per Referenz übergeben wird,
  • wenn die Funktion ihn als skalaren Wert initialisiert (eine Zahl oder ein String), dann ist er keine Referenz.

Alle Details stehen im Handbuch unter Passing Function Arguments by Value Or by Reference.

Lokale Variablen

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.

  • Wenn du einem Parameter einen skalaren Wert zuweist, ist dieser lokal für die Funktion.
  • Wenn du einer Variablen, die nicht in der Parameterliste steht, einen Skalar zuweist, ist diese Variable global.

Ü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
}
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
AWK Exercism

Bereit, mit Matrix zu starten?

Melde dich bei Exercism an, um AWK mit 3 Konzepte92 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.