Sicher verstaut - Deduplizierung spart Platz, Cloud-Backup für Windows, Areca sichert kostenlos. ADMIN 01/14 stellt Backups für Profis mit und ohne Cloud ... (mehr)

Strings

Zeichenketten lassen sich – wie von anderen Sprachen gewohnt – mit einfachen oder doppelten Anführungszeichen definieren. Eine Besonderheit sind allerdings Strings, die sich über mehrere Zeilen erstrecken. Hier verlangt Lua doppelte eckige Klammern, um einen solchen String einzuschließen. Ein HTML-String sieht damit zum Beispiel so aus:

html = [[
  <html>
  <head>
  ...
]]

Um Strings zu verbinden, gibt es den speziellen Operator »..« . Wie in anderen Sprachen etwa »+« zu verwenden, funktioniert in Lua nicht. Dieser Operator bleibt Zahlen vorbehalten. Zur Formatierung gibt es ähnliche Formatstrings wie in der Programmiersprache C, die sich für Zahlen so verwenden lassen:

string.format("%.7f", math.pi)

Das String-Modul bietet außerdem eine Reihe von Funktionen, mit denen man zum Beispiel Zeichen in Strings suchen kann. So gibt »string.find(String, Suchstring)« zwei Zahlen aus, die für den Beginn und das Ende des gefundenen Strings stehen. »string.gmatch« gibt einen Iterator zurück, der mit einem Suchmuster versehen nacheinander alle Fundstellen liefert. Weitere Funktionen geben die Länge eines Strings aus, wandeln Groß- und Kleinbuchstaben um oder umgekehrt, drehen einen String um und so weiter.

Im Prinzip lassen sich in Lua-Strings auch UTF-8-Zeichenketten speichern, denn sie verwenden acht Bits zur Repräsentation. Allerdings gibt es im Sprachkern keine darüber hinausgehenden Features zur Verarbeitung von UTF-8. Derzeit gibt es ein paar Module wie »slnunicode« , die das übernehmen. Im Lua-Sprachkern soll die Unterstützung von UTF-8 in einer kommenden Versionen folgen.

Das Angebot an Zahlentypen ist überschaubar: Es gibt nur eine »number« , die als Fließkommazahl weitgehend dem Float in anderen Programmiersprachen entspricht. Insbesondere gibt es keine Ganzzahlen (Integer) als Variablentyp.

Auch bei den angebotenen Datenstrukturen gibt sich Lua bescheiden. Es gibt nur die Tables, die Arrays und Hashes anderer Programmiersprachen ersetzen. Dabei funktionieren Tabellen im Prinzip ohnehin wie Hashes oder Dictionaries: Eine Variable kann nicht nur einen einzelnen Wert aufnehmen, sondern über sogenannte Keys, die unterschiedlichen Typen angehören dürfen, eine Vielzahl von Werten. Dabei müssen in einer Table weder die Keys noch die Werte vom gleichen Typ sein. Eine neue Tabelle wird in Lua mit der Expression »{}« initialisiert:

t = {}
t['foo'] = 'bar'
t['123'] = 'linux'

Wie die Lua-Entwickler betonen, sind Tables eigentlich keine Variablen oder Typen, sondern dynamische Objekte, auf deren Werte man im eigenen Programm nur mittels Referenzen Bezug nimmt. Das klingt komplizierter als es ist und ist bei der Programmierung auch nicht weiter von Bedeutung, aber man sollte im Kopf behalten, dass Tabellen bei der Zuweisung nicht kopiert werden, sondern es sich immer weiter um dieselbe Tabelle handelt. Ein Beispiel:

x = {}
x['os'] = "linux"
y = x
print(y['os'])
linux

Jetzt ist auch der Inhalt von »y['os']« der String »linux« , wie die Ausgabe der Print-Anweisung zeigt. Um dem Programmierer Tipparbeit zu ersparen, bietet Lua auch eine Kurzschreibweise dafür, den Key anzugeben:

print(y.os)
linux

Mit Tables lassen sich auch Arrays realisieren. Dazu muss man sich bei der Verwendung eben nur auf durchgehende numerische Werte für die Keys beschränken. Prinzipiell können die Arrays bei jedem Wert, also auch 0 oder 1 beginnen. Nach Lua-Konvention starten sie allerdings bei 1. Zweidimensionale Datenstrukturen wie Matrizen entstehen, wenn man eine Table definiert, die Tables enthält.

Ausprobieren lässt sich all dies, indem man den Lua-Interpreter »lua« aufruft, der in einem interaktiven Modus startet, in dem man Code eingeben kann. Alternativ führt er Lua-Skripts aus, die er als Parameter erwartet. Außerdem gibt es einen Lua-Compiler namens »luac« , der Programme vor der Ausführung in Lua-Bytecode übersetzt. Das spart ein bisschen Übersetzungszeit beim Ausführen ein, bringt aber ansonsten keinen Performance-Vorteil.

Erste Klasse: Funktionen

Zur Strukturierung der Programme bietet Lua Funktionen, die wie erwähnt eigene Typen darstellen. Man kann sie also zum Beispiel auch in Variablen speichern. Definiert werden Funktionen mit dem Schlüsselwort »function« , gefolgt von Klammern, in denen die Parameter stehen. Dann folgt der Funktionsrumpf (Body), der mit dem Schlüsselwort »end« abgeschlossen wird. Um eine variable Anzahl von Parametern zu definieren, bietet Lua das Konstrukt »...« an, das in Codebeispielen verwirrt, weil man meinen könnte, der Kürze wegen sei Code weggelassen worden. Über »select(x, ...)« lässt sich das x-te Elemente im Funktionsrumpf ansprechen. Die Anzahl der tatsächlich übergebenen Parameter liefert »select('#', ...)« . Alternativ dazu packt die Anweisung »args = {...}« alle Argumente in die Table »args« .

Der Lua-Interpreter beschwert sich auch nicht, wenn eine Funktion beispielsweise drei Parameter vorsieht, aber beim Aufruf nur zwei angegeben werden. Der fehlende Parameter ist dann einfach mit »nil« belegt. Ein gängiges Idiom, um Default-Werte für Parameter zu emulieren, die es in Lua nicht gibt, sieht so aus:

function f(a, b, c)
   local a = a or 0
   ...

Die lokale Variable »a« erhält also den Wert der Parameter-Variablen »a« , wenn diese vorhanden ist, ansonsten den Wert 0. Weil man Funktionen in Variablen speichern und an andere Funktionen übergeben darf, lassen sich so auch Funktionen höherer Ordnung konstruieren. Deshalb eignet sich Lua auch dazu, im funktionalen Stil zu programmieren, der durch Sprachen wie Scala, Clojure und sogar Javascript (in Form von Node.js) zur Zeit wieder in Mode gekommen ist. Zur Parallelisierung von Programmen bietet Lua keine Threads, sondern Coroutinen, die weniger fehleranfällig sind.

Ähnliche Artikel

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023