Verständnisprobleme in der Syntax: print <<END;

Alles, was Perl betrifft, kann hier besprochen werden.

Verständnisprobleme in der Syntax: print <<END;

Postby Enfa » 18. January 2007 08:53

Hallo Allerseits,

könntet ihr mir erklären was diese Syntax bedeuten:

1.) print <<"END";

2.) print <<END;

print heisst ja auf dem Bildschirm drucken. <<, heisst eigentlich bitweise Verschiebung.

Ich verstehe nicht den Zusammenhang?

Im Internet stehen einige Perl-Scripte zur Verfügung, und einige von den benutzen diesen Syntax.

Wenn ich es an mein Rechner laufen lassen will, klappt es wegen dieser Syntax nicht.

ich benutze Perl: ActivePerl-5.8.8.819-MSWin32-x86-267479 unter Windows 2000.

Vielen Dank im Voraus.

Mit freundlichem Gruß,

Fatih Üstünel
Enfa
 
Posts: 6
Joined: 05. December 2006 13:35

Postby deepsurfer » 18. January 2007 11:16

hhmmm mal schauen ob ich das einfach erklären kann.

Diese Anweisung ist eine Erleichterung bei der Programmierung
Eiegntlich wird immer davon ausgegenagen das nach der "print" Anweisung etwas vom PERL-Parser an Browser zum Anzeigen übergeben wird.

Basteln wird uns mal ein Einfaches Script.

Code: Select all
#!perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n";
print "<html><head><title>CGI-END Prozedure</title></head>\n";
print "<body><h1>CGI-END Prozedur für ANzeige in Browser</h1>\n";
print "<p>Ich bin eine Sichbare Ausgabe von Parser an den Browser</p>\n";
print "<p>Wenn ich nicht hier wäre, ist der Bildschrim weiss</p>\n";
print "</body></html>\n";



Wie Du siehst wird jede gewünschte Ausgabe in eine "print" Anweisung gestellt die mit dem return-code und zeilenende "\n;" abgeschlossen werden.

In deiner speziellen Frage sind keine Codeschnippsel vorhanden, aber wenn du mal Hinschaust so siehst du das zwischen

print <<END;
....
....
....
END

gewünschte Ausgaben definiert sind.

Das kann kann man nun auch auf das beispiel script anwenden.
Und du siehst das damit die Programmierung einer gewünschten Ausgabe sehr vereinfacht wird.

Code: Select all
#!perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n";

print <<END;
<html><head><title>CGI-END Prozedure</title></head>
<body><h1>CGI-END Prozedur für ANzeige in Browser</h1>
<p>Ich bin eine Sichbare Ausgabe von Parser an den Browser</p>
<p>Wenn ich nicht hier wäre, ist der Bildschrim weiss</p>
</body></html>
END


Mit dieser Art lassen sich ganz bequem ganze Blöcke von gewünschten Ausgaben Programmieren ohne darauf zu achten ob der return-code vorhanden ist.

Beispiel Advanced
Code: Select all
#!perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n"; 
#Das sollte/kann/darf einmal definiert werden am Anfang eines Scriptes, da dies dann für das ganze Script übernommen wird.

print <<END;
<html><head><title>CGI-END Prozedure</title></head>
<body><h1>CGI-END Prozedur für ANzeige in Browser</h1>
<p>Ich bin eine Sichbare Ausgabe von Parser an den Browser</p>
<p>Wenn ich nicht hier wäre, ist der Bildschrim weiss</p>
END

##hier würden jetzt parser befehle auftauchen die nicht sichtbar sind
## z.b. Auswerten eines formulars
##irgendwann käme dann wieder eine Ausgabe

print <<END;
<p>Ich bin auch Sichtbar, weil ich etwas nach dem Parsen anzeigen soll</p>
<p>Wenn ich nicht hier wäre, ist der Bildschrim weiss</p>
<p> Die Prozudure mit dem print END befehl kann beliebig oft benutzt werden.
END

## hier noch einige Parser befehle

print <<END;
Sind nun am ende des Scriptes, bzw. der gewünschten Ausgabe angekommen.<br />
Nun muss noch das HTML feld geschlossen werden.
</body></html>
END


Man könnte das "print <<END;" als ins sich geschlossenen Array bezeichnen, was aber sinngemäss falsch ist das man mit dem "print" Befehl wesentlich mehr mit anstellen kann.

" print <<END; " und " print <<"END"; " sind gleichgesetzt und bedeuten das selbe.

Hoffe ich konnte die Funktion ein wenig näher bringen.
Das Thema an sich ist aber wesentllich komplexer.
Hierbei handelt es sich lediglich um eine Vereinfachung der Programmierung zu einer gewünschten Ausgabe ohne jede Zeile für die Ausgabe in einen eigenen "print Befehl" zu setzen.

---------------
Bin nicht Fehlerfrei, sollte meine Ausführung nicht der Wahrheit bzw. gänzlich falsch liegen, so sollte das Sachlich Kommentiert werden und nicht mit nichts sagenden Kommentaren niedergemacht werden...Danke...
chirio Deep
Wie sagte einst der MCP aus Tron auf dem Bildschirm zu schreiben Pflegte
" ... end of communication ... "
User avatar
deepsurfer
AF Moderator
 
Posts: 6440
Joined: 23. November 2004 10:44
Location: Cologne
Operating System: Win-XP / Win7 / Linux -Debian

Postby Wiedmann » 18. January 2007 17:25

Das ganze hat einen Namen:
Here document

Und gibt es nicht nur bei Perl:
http://en.wikipedia.org/wiki/Heredoc
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby Enfa » 19. January 2007 08:59

Hallo,

@deepsurfer: super Erklärung. Vielen Dank. Ohne dich hätte ich es nicht rausgekriegt. Im Online Docs habe ich nichts gefunden. Oder übersehen.

Ich habe die ersten beiden Beispiele kopiert.

erste Beispiel habe ich einfach mal auf der Konsole ausgegeben. Natürlich werden die HTML-Tags mit ausgegeben.

Dann wolte ich natürlich ausprobieren, ob es mit print <<END auch funktioniert.

Aber es funktioniert nicht. Folgende Fehler kommt auf der KOnsole:

Content-type: text/html

<h1>Software error:</h1>
<pre>Can't find string terminator &quot;END&quot; anywhere before EOF at ausgabe
_2.pl line 8.
</pre>
<p>
For help, please send mail to this site's webmaster, giving this error message
and the time and date of the error.

</p>
[Fri Jan 19 08:49:38 2007] ausgabe_2.pl: Can't find string terminator "END" anyw
here before EOF at ausgabe_2.pl line 8.

Zeile 8 ist: print <<END;

Ich habe ActivePerl-5.8.8.819-MSWin32-x86-267479 runtergeladen. Und installiert.

Da fehlt wahrscheinlich was, oder?? Muss ich was dazu installieren?

Vielen Dank im Voraus.

Tschüss
Enfa
 
Posts: 6
Joined: 05. December 2006 13:35

Postby deepsurfer » 19. January 2007 15:10

Ahhhh grad mal gegen getestet (meine beispiel scripte)

das erste funktioniert
das zweite nicht
das dritte funktioniert

Ich schau nochmal nach und verbessere es dann...


Joooo.... zweites Script muss nach dem END noch eine "neue" Zeile haben, also einfach return drücken, sodass im Asciibereich dieses Scriptes eine neue Zeile vorhanden ist.
Code: Select all
#!/xampp/perl/bin/perl.exe -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n\n";

print <<END;
<html><head><title>CGI-END Prozedure</title></head>
<body><h1>CGI-END Prozedur für ANzeige in Browser</h1>
<p>Ich bin eine Sichbare Ausgabe von Parser an den Browser</p>
<p>Wenn ich nicht hier wäre, ist der Bildschrim weiss</p>
</body></html>
END  # hiernach einmal return drücken, abspeichern dann sollte es auch bei dir gehen.



Daher funktioniert bei mir das dritte Script auf anhieb, dort habe ich noch eine "neue" Zeile unten dran.

Kannst auch eine raute (#) setzen als neue Zeile, dann geht es auch.
Bedeutet lediglich das das Script das letzte END als eigene Zeile vorfindet damit es weiss das dieses END zur print Operation gehört.
chirio Deep
Wie sagte einst der MCP aus Tron auf dem Bildschirm zu schreiben Pflegte
" ... end of communication ... "
User avatar
deepsurfer
AF Moderator
 
Posts: 6440
Joined: 23. November 2004 10:44
Location: Cologne
Operating System: Win-XP / Win7 / Linux -Debian


Return to Perl

Who is online

Users browsing this forum: No registered users and 17 guests