Gawk/Eigene Funktionen: Unterschied zwischen den Versionen

Aus Foxwiki
K Textersetzung - „bzw.  “ durch „bzw. “
Keine Bearbeitungszusammenfassung
 
Zeile 1: Zeile 1:
{{DISPLAYTITLE:gawk:Eigene Funktionen}}
{{DISPLAYTITLE:gawk/Eigene Funktionen}}


= Eigene Funktionen =
= Eigene Funktionen =

Aktuelle Version vom 30. März 2024, 01:02 Uhr


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));
 }