Was mache ich mit langen Strings in einem Skript?
Inhalt:
Das Problem
Du willst z.B. eine längere Zeichenkette mit
print ausgeben und schreibst daher
mehrere print-statements hintereinander. Im String selbst kommen Anführungszeichen
vor, deshalb musst du die zusätzlich noch escapen. Das ganze sieht dann traurigerweise
in etwa so aus:
print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">', "\n";
print "<html>\n";
print "\n";
print "<head>\n";
print "<title>titel</title>\n";
print "<link href=\"http://server/stylesheet.css\" rel=\"STYLESHEET\" type=\"text/css\">\n";
print "</head>\n";
...
Das sieht aus, als wäre es auf Dauer schädlich für die Augen. Aber da wir glücklicherweise
nicht PHP oder Java programmieren, gibt es da Abhilfe:
Quoting-Operatoren gegen \"
In Perl gibt es quoting-Operatoren. In obigen Beispiel wäre es zwar noch halbwegs
sinnvoll, statt doppelten " einfache ' zu nehmen, also:
print '<link href="http://server/stylesheet.css" rel="STYLESHEET" type="text/css">',"\n";
aber dafür musste, wie man sieht, das \n abgetrennt werden. Nehmen wir stattdessen den
Operator
qq// (doppeltes q bedeutet doppelte anführungszeichen, d.h. variablen werden
auch interpoliert und \n wird zum echten newline):
print qq{<link href="http://server/stylesheet.css" rel="STYLESHEET" type="text/css">\n};
Hier wird
qq// nicht mit Slashes / verwendet, sondern mit {}. Diese Begrenzer kan man
sich fast beliebig aussuchen, also etwa qq(), qq,, qq[], qq##, usw. Näheres findest du in
perlop.pod.
Mehrere Zeilen
Nun haben wir aber mehrere Zeilen und immer noch diese vielen print-statements.
Das ist unübersichlich und dazu auch noch langsam! Aber moment mal, wer sagt denn überhaupt,
dass man in perl nicht einen Befehl über mehrere Zeilen schreiben kann?
print qq{<title>titel</title>
<link href="http://server/stylesheet.css" rel="STYLESHEET" type="text/css">
</head>};
Aha! So kann man durchaus ein ganzes HTML-Dokument schreiben. Aber man muss dann
höllisch aufpassen, dass nicht irgendwo eine Klammer } vorkommt. Bei längeren
Strings ist das also etwas gefährlich, aber dafür gibt es wiederum eine Lösung,
die aus der UNIX-Welt kommt:
Here-Documents
Here-Documents werden mit
<<BELIEBIGER_TEXT eingeleitet. Darunter kann nun
beliebig Text stehen. Die Grenze ist in diesem Fall der String
BELIEBIGER_TEXT
einzeln in einer Zeile (ohne Leerzeichen davor oder danach und mit Newline dahinter!)
Beispiel:
print <<END_OF_HTML;
<title>titel</title>
<link href="http://server/stylesheet.css" rel="STYLESHEET" type="text/css">
</head>
END_OF_HTML
Komplettes Beispiel mit Here-Document:
Unser Beispiel von ganz oben sähe mit Here-Documents so aus:
print <<EOM;
Content-type: text/html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<title>titel</title>
<link href="http://server/stylesheet.css" rel="STYLESHEET" type="text/css">
</head>
EOM
...
Feinheiten
Here-Documents kann man auch mit double- oder single-quote-Eigenschaften ausstatten.
also bei
print <<"HERE";
test $var
HERE
wird $var interpoliert, d.h. mit dem Inhalt von $var ersetzt. Hier allerdings:
print <<'HERE';
test $var
HERE
nicht. $var bleibt so stehen. Der Default ist "".
Ergänzungen, Kommentare
Kommentare werden am besten in folgender Form vorgenommen, damit
sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne das <verbatim>):
---+++ Main.??? - 14 Jul 2003 - Betreff