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

UtilFaqSubForm edit

Titel Was mache ich mit langen Strings in einem Skript?
Autor TinaMueller
Bereich FaqStrings
Topic revision: 2004-03-10, TinaMueller
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.