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 jedes Mal 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.
![]() ![]() |
Basierend auf einem Forums-Beitrag vom 03.03.1999 von:
Frank Schönmann, fs@tower.de
Möchte man Perl-Module verwenden, die nicht standardmäßig auf dem Server installiert sind, der Provider diese aber auch nicht nachträglich installieren will, bleibt immer noch die Möglichkeit, die betreffenden Module lokal in seinem eigenen Homeverzeichnis zu installieren. Alles was man dazu benötigt, ist etwas Speicherplatz und einen Telnet-Zugang.
Die Installation der Module erfolgt nicht durch einfaches kopieren, sondern durch ein Skript (Makefile.PL), das eine Datei mit Anweisungen für das Kommando make erstellt. Mit diesem Skript kann man über den Parameter PREFIX das Verzeichnis festlegen, in dem später die Module liegen. Durch Aufruf des Programms make werden dann benötigte Dateien erstellt und konfiguriert, durch ein folgendes make install werden alle Dateien in die entsprechenden Verzeichnisse kopiert.
tar xvfz dateiname.tar.gz Entpacken der Datei cd dateiname Verzeichniswechsel perl Makefile.PL PREFIX=/home/benutzername/perl Konfiguration der Makefiles make Erstellung benötigter Dateien make install Installation durch Kopieren der Dateien |
Die Einbindung der Module erfolgt genauso wie bei normal im System installierten Modulen mit use. Zusätzlich muss jedoch noch der Pfad, in dem die lokal installierten Module liegen, in die Liste der Modul-Verzeichnisse aufgenommen werden.
use lib '/home/benutzername/perl/site_perl/lib'; Verzeichnis zur Liste der Modul-Pfade hinzufügen use Installiertes::Modul; Modul einbinden |
![]() ![]() |
Basierend auf einem Forums-Beitrag vom 16.01.1999 von:
Jörg Wittemeier, info@goby.net
Cheatah, Hajo@hadiko.de
Frank Schönmann, fs@tower.de
Vor allen Dingen unter Unix/Linux stehen die beiden folgenden Zeitangaben zur Verfügung: Anzahl der Sekunden seit dem 01.01.1970 und Angabe der Zeit in einer lesbar(er)en Form (z.B. Fri Jun 20:29:11 1997). Um diese beiden verschiedenen Arten der Zeitangabe unter Perl ineinander zu konvertieren, empfehlen sich die folgenden Möglichkeiten.
Diese Aufgabe kann ganz einfach mit der Funktion localtime gelöst werden, die extra für diesen Zweck geschaffen wurde.
($sek, $min, $std, $mtag, $mon, $jahr, $wtag, $jtag, $ismrzeit) = localtime($sekunden); |
Die umgekehrte Konvertierung ist am schnellsten über ein mitgeliefertes Modul möglich.
use Time::Local; $sekunden = timelocal($sek, $min, $std, $mtag, $mon, $jahr); |
![]() | |
weiter:![]() |
![]() |
zurück:![]() |
![]() |
![]() ![]() ![]() |
© 2000 das Redaktionsteam