gawk/Eigene Funktionen
Erscheinungsbild
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));
}