SELFHTML
Forums-Auslese
CGI und Perl
Basierend auf einem Forums-Beitrag vom 17.11.1998 von:
Jörk Behrends, jbehrends@abstrakt.de
In Perl gibt es keine Funktion, die auf diese Weise rundet. Sie können sich aber eine Rundungsfunktion selbst schreiben. Achtung: Kommazahlen in Perl müssen mit einem . (Punkt) statt einem , (Komma) angegeben werden, z.B. 3.75624.
$ungerundet = 3.75624; $gerundet = &round($ungerundet); # ergibt 4 sub round { my $zahl = shift; $zahl = int($zahl + 0.5); return $zahl; } |
Sie können die Funktion mit &round($ungerundet); aufrufen. Als Rückgabewert erhalten Sie die gerundete Zahl. Zum Runden wird einfach 0.5 addiert, dann werden die Nachkommastellen abgeschnitten.
Wollen Sie auf eine andere Stelle runden, können Sie den Wert vorher entsprechende multiplizieren, damit die ganzzahlige Rundung wieder einsatzfähig ist, beispielsweise mit 100 für zwei Nachkommastellen.
$ungerundet = 3.75624; $gerundet = (&round($ungerundet * 100)) / 100; # ergibt 3.76 sub round { my $zahl = shift; $zahl = int($zahl + 0.5); return $zahl; } |
Eine weitere Möglichkeit zum Runden ist die Funktion sprintf. Diese verwendet einen Formatstring, der einen Platzhalter für eine Fließkommazahl enthält. Als weiteren Parameter enthält sie den einzusetzenden Wert (also die zu rundende Zahl). Der Platzhalter im Formatstring für Fließkommazahlen ist %X.Yf. X steht für die Mindestanzahl der Vorkommastellen, Y für die zu verwendenden Nachkommastellen.
$ungerundet = 3.75624; $gerundet = sprintf("%0.4f", $ungerundet); |
Sie können auch mit regulären Ausdrücken eine Zahl runden. Dabei betrachten Sie die Zahl aber nicht als Zahl, sondern als String. Da diese Möglichkeit jedoch eher unübersichtlich ist, sollten Sie wenn möglich eine der obigen Varianten verwenden.
# Um nur die ersten beiden Stellen auszugeben $zahl =~ s/\.(\d{0,2})\d*/\.$1/; # Um die Nachkommastellen mit Nullen aufzufüllen $zahl =~ s/\.(\d{0,2})\d*/substr(".${1}00", 0, 3)/e; # Um auch Zahlen ohne Komma mit zwei Nachkommastellen darzustellen $zahl =~ s/(?:(\.\d{0,2})\d*)?$/substr("${1}00", 0, 3)/e; |
Informationen zum Runden in Perl finden sich auch in der Perl-FAQ.
![]() ![]() |
Basierend auf einem Forums-Beitrag vom 28.10.1998 von:
Frank Schönmann, fs@tower.de
Jörk Behrends, jbehrends@abstrakt.de
Wenn Sie in einem Perl-Skript mehrere Zeilen auf einmal ausgeben wollen, ohne jedesmal ein print davor zu setzen, bietet sich die folgende Möglichkeit an. Das ganze nennt sich "Hier-Dokument" (engl. "here-document").
print <<'EOT'; Content-type: text/html <html> <head> ... </head> <body> ... </body> </html> EOT |
Perl erkennt alles zwischen der print <<'EOT'-Answeisung und dem String EOT als auszugebenden Text. Selbst Zeilenumbrüche in dem Text werden als solche erkannt. Diese Funktionsweise kann man am ehesten mit dem <pre>-Tag in HTML vergleichen. Wichtig ist auch der abschließende Zeilenumbruch nach dem EOT.
Verwenden Sie statt der obigen Version ein print <<"EOT", werden Sonderzeichen im Text als solche erkannt und Variablen interpoliert. Der Name der Textmarke, hier EOT, ist frei wählbar.
![]() ![]() |
Basierend auf einem Forums-Beitrag vom 1.09.1998 von:
Markus Schaber, markus.schaber@student.uni-ulm.de
Stefan Münz, muenz@csi.com
In der Datei steht an dieser Stelle ein "Carriage Return" (ASCII-Wert: 15) als Zeilenumbruch. Allerdings wird nur von Windows die Zeichenkombination "Carriage Return"-"Line Feed" zu diesem Zweck verwendet. Perl-Interpreter, die diese Tatsache nicht beachten, finden am Ende der Zeile nur ein unbekanntes Zeichen, das als Fehler angesehen wird. Entfernen können Sie die "Carriage Returns", indem Sie mit dem Befehl recode die Datei neu von Windows nach Unix kodieren.
Um von vorneherein sicher zu gehen, sollten Sie - auch unter Windows - Perl-Skripts immer im Unix-Format abspeichern. Windows-Editoren, die dies unterstützen, sind zum Beispiel TextPad oder - speziell für Web-Dokumente -
Homesite.
![]() | |
weiter:![]() |
![]() |
zurück:![]() |
![]() |
SELFHTML
Forums-Auslese
CGI und Perl
das Redaktionsteam