gawk/Eigene Funktionen
Eigene Funktionen
- Die eingebauten Funktionen decken einen weiten, aber doch nicht jeden Anwendungsbereich ab.
- Erst eigene Funktionen eröffnen den Weg zu effizienten Programmen, vor allem dann, wenn identische Abläufe wiederholt im Programm auftreten.
Funktionsdefinition
- Eine Funktion muss vor ihrer ersten Verwendung definiert sein.
- Ihre Definition erfolgt zweckmäßig zu Beginn eines Awk-Skripts, erlaubt ist sie auch zwischen BEGIN-Block und Hauptprogramm bzw. zwischen Hauptprogramm und END-Block.
Der allgemeine Aufbau einer Funktion ist:
function name([Parameter [, Parameter] ]) { # Anweisungen... }
- Als Funktionsname sind alle Kombinationen aus Buchstaben, Ziffern und dem Unterstrich zulässig, wobei zu Anfang keine Ziffer stehen darf.
- In einem Programm darf eine Funktion nicht gleich lauten wie der Bezeichner einer Variable.
- Als Argumente können beliebig viele Parameter an eine Funktion übergeben werden, wobei das Komma als Trennzeichen dient.
Als erstes Beispiel berechnet eine Funktion facultiy die Fakultät zu einer Zahl x:
function faculty(x) { if (x = 0) return 1; return x*faculty(x-1) }
- Unsere Version von faculty ist rekursiv realisiert, was Awk problemlos akzeptiert.
- Zur Rückehr aus einer Funktion kann return mit optionalem Rückgabewert verwendet werden.
- Fehlt return, kehrt die Funktion nach Ausführung der letzten Anweisung zurück.
Funktionsaufruf
- Zur Verwendung der Funktion rufen Sie diese einfach auf.
- Im Gegensatz zu den eingebauten Funktionen darf bei nutzerdefinierten Funktionen kein Leerzeichen zwischen Funktionsname und der öffnenden runden Klammer stehen!
- Die Angabe von weniger Parametern als definiert ist zulässig; abhängig vom Kontext werden diese als leere Zeichenkette oder als 0 interpretiert.
Im folgenden Programm wird der zu berechnende Wert per Kommandozeilenargument übergeben:
#!/usr/bin/awk -f function faculty(x) { if (x = 0) return 1; return x*faculty(x-1) } BEGIN { if (ARGC < 2) { print "Fehlendes Argument!"; exit 1; } if (ARGV[1] !~ /^digit:+$/) { print "Unzulaessiges Argument!"; exit 2; } print faculty(ARGV[1]); }
Lokale und globale Variablen, Parameterübergabe
- Damit haben Sie fast das Rüstzeug beisammen, um eigene komplexe Funktionen zu verfassen.
- Doch die eigenwillige Semantik Semantik der Verwendung von Variablen kann zumindest für den Programmierneuling schnell zu Stolperfalle werden.
- Mit einer Ausnahme hat eine Funktion grundsätzlichen Zugriff auf alle Variablen, die im Programm bis zum Aufruf der Funktion eingeführt wurden.
- Solche globalen Variablen können in der Funktion verändert, gelöscht (nur Array-Elemente [delete]) oder sogar neu eingeführt werden.
Lokale Variablen sind einzig jene, die in der Parameterliste benannt wurden.
- Diese Variablen verdecken ggf. vorhandene gleichnamige Variablen des Programms, sodass Änderungen an diesen in der Funktion »außen« nicht sichtbar werden.
- Das folgende Programm demonstriert die Verwendung von globalen und lokalen Variablen
$ cat context.awk #!/usr/bin/awk -f function context(x, a) { printf("In der Funktion...\n") printf("\tx = %d\n\ta = %d\n\tb = %d\n", x, a, b); x = a = b = 99; } BEGIN { x = a = 100; printf("Vor Aufruf der Funktion...\n") printf("\tx = %d\n\ta = %d\n\tb = %d\n", x, a, b); context(10); printf("Nach Aufruf der Funktion...\n") printf("\tx = %d\n\ta = %d\n\tb = %d\n", x, a, b); }
$ ./context.awk Vor Aufruf der Funktion... x = 100 a = 10 b = 0 In der Funktion... x = 10 a = 0 b = 0 Nach Aufruf der Funktion... x = 100 a = 100 b = 99
Das abschließende Beispiel dreht einem das Wort im Munde um...
function reverse (x) { if (length(x) = 0) return ""; return substr(x, length(x), 1) reverse(substr(x,1, length(x)-1)); }