Formate

[ vorherige Seite ] [ Titelseite ] [ Inhalt ] [ Index ] [ nächste Seite ]


Einführung


Eine einfache Möglichkeit, Protokolle oder Tabellen übersichtlich auszugeben, bieten sogenannte Formate. Dort können beispielsweise Spalten einer Tabelle definiert werden; jeweils mit Breite und Positionierung des Eintrags (rechts-, linksbündig oder zentriert). Außerdem kann ein Seitenkopf definiert werden, der bei Ausgaben, die sich über mehrere Seiten erstrecken, auf jeder einzelnen Seite vor den eigentlichen Daten ausgedruckt wird.

Um Daten formatiert auszugeben, muß der Befehl write (optional mit einem Filehandle) benutzt werden. Es können für jedes Filehandle unabhängig voneinander Formate definiert werden.

[Seitenanfang]


Definition eines Formats


Das Schema einer Formatdefinition sieht wie folgt aus:

format Name =
Musterzeile
Variablenzeile
.

Im einfachsten Falle ist der Name eines Formats gleich dem Namen des Filehandles, für das das Format verwendet werden soll (Standardwert: STDOUT). Will man einer Formatdefiniton einen anderen Namen geben, so kann die entsprechende Zuordnung von Formatname und aktuellem Filehandle durch Setzen der Variablen $~ geschehen.

Um bei mehrseitigen Dokumenten jeweils automatisch einen Seitenkopf ausgeben zu lassen, kann ein spezielles Format hierfür definiert werden. Der Name wird gebildet durch das Anhängen von "_TOP" an das Filehandle (Standardwert: STDOUT_TOP). Alternativ dazu kann eine beliebiger Name durch Setzen von $^ verwendet werden. Ansonsten erfolgt die Definition vollkommen analog zu der eines normalen Formats.

Die Musterzeile enthält die Definitionen der einzelnen Felder, in die dann später die Werte der Variablen der darauffolgenden Zeile eingetragen werden. Es dürfen mehrere Muster- und Variablenzeilen angegeben werden; allerdings ist darauf zu achten, daß sie immer paarweise auftreten (jede Variablenliste "füllt" die darüberstehende Musterzeile).

Außerdem können noch überall Kommentarzeilen eingefügt werden, die mit einem "#" beginnen.

Die Definitionen von Formaten dürfen an beliebiger Stelle im Programmcode stehen (wie Unterprogramme).

[Seitenanfang]


Musterzeile


Jede dieser Zeilen bestimmt Felder in der Ausgabe, in die dann Variablenwerte (festgelegt in der jeweils darauffolgenden Zeile) eingesetzt werden sollen.

Ein normales Feld besteht aus einem "@" gefolgt von null oder mehr Positionierungszeichen eines Typs:

"<" (linksbündig)
"|" (zentriert)
">" (rechtsbündig)

Beispiel:

#!/usr/local/bin/perl -w

use strict;

my $v = 12;

write;

format STDOUT =
#    eine Spalte, vierstellig, zentriert
@|||
$v
.
 12

Eine mehrzeilige Ausgabe von Zeichenketten wird durch Felder bewerkstelligt, die mit einem "^" beginnen. Dabei wird dann dort, wo das Feld in der Formatdefinition zum ersten Mal erscheint, ein möglichst großer Teil des Ausgabestrings dargestellt. Beim zweiten Auftreten wird ggf. dann ein Teil des Restes dargestellt, usw. (Achtung: in der Zeichenkette wird dabei sukzessive der jeweils dargestellte Teil entfernt, d.h., der Wert der Stringvariablen ändert sich u.U. bei jedem write).

Beispiel:

#!/usr/local/bin/perl -w

use strict;

my $text = "Dies ist ein Beispiel dafür, wie in einem ";
$text .= "Format mehrzeilige Textbeiträge dargestellt ";
$text .= "werden können.";

write;

format STDOUT =
#    bis zu drei Zeilen Text
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$text
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$text
^<<<<<<<<<<<<<<<<<<<<<<<< ...
$text
.
Dies ist ein Beispiel dafür,
wie in einem Format
mehrzeilige Textbeiträge ...

Oft weiß man vorher nicht, wie lang der Text wird. Um unnötige Leerzeilen zu vermeiden, setzt man einfach in die entsprechende Musterzeile eine Tilde ("~"). Will man einen längeren Text auf jeden Fall komplett ausgeben, so kann man dies durch zwei aufeinanderfolgende Tilden ("~~") in einer Musterzeile erreichen. In diesem Falle wird die Ausgabe dieser Zeile so oft wiederholt bis die Zeichenkette in der dazugehörenden Stringvariable vollständig dargestellt ist. Schließlich kann ein Text in seiner natürlichen Zeilenaufteilung in ganzer Länge ausgegeben werden, indem der Stringvariablen in der Musterzeile das Feld "@*" zugeordnet wird.

Eine besondere Art der Positionierung bietet das "#". Nach einem "@" bewirkt es eine rechtsbündige Darstellung, wobei bei der Ausgabe einer Zahl ein optionaler Dezimalpunkt berücksichtigt wird. Nach einem "^" wird ein so markiertes Feld nur dann dargestellt, wenn die dazugehörende Variable definiert ist.

Beispiel:

#!/usr/local/bin/perl -w

use strict;

my $v = 117.127;
my $w = undef;
write;

format STDOUT =
Betrag: @###.## EUR (^###)
$v, $w
.
Betrag:  117.13 EUR (    )

[Seitenanfang]


Variablenzeile


Eine Zeile dieser Art legt fest, welche Variablenwerte in die jeweils vorangegangene Musterzeile eingetragen werden sollen.

Dies kann einfach durch eine durch Kommata getrennte Liste sein; aber es ist auch möglich, Arrays (die mehrere Felder der Musterzeile abdecken) oder gar ganze Ausdrücke anzugeben, die dann beim Aufruf des Formats (via write) abgearbeitet werden. Die Variablenliste kann über mehrere Zeilen ausgedehnt werden, indem geschweifte Klammern ("{...}") verwendet werden.

Beispiel:

#!/usr/local/bin/perl -w

use strict;

my @datum = (6,1,1997);

my $x = 12;

write;

format STDOUT =
#    Datumsdarstellung
Datum: @>.@>.@>>>
@datum
#   Potenzen von $a
@>>>> @>>>> @>>>>
{
   $x,
   $x*$x,
   $x*$x*$x
}

.
Datum:  6. 1.1997
   12   144  1728

[Seitenanfang]


Spezielle Variablen


Wenn man statt der Kurzbezeichnungen sprechende Namen benutzen möchte, so kann kann man dies mit Hilfe des Standard-Moduls English erreichen, indem man am Programmanfang "use English;" schreibt. Dann können auch die in Klammern stehenden Bezeichnungen verwendet werden.

[Seitenanfang]


[ vorherige Seite ] [ Titelseite ] [ Inhalt ] [ Index ] [ nächste Seite ]

Autor: Eike Grote Version: 2.06 (15.9.2013)