SELFHTML/Navigationshilfen Perl Perl-Funktionen | |
Funktionen für Berechnungen |
|
Allgemeines zu diesen Funktionen |
|
Perl stellt in seinem Kern nur wenige mathematische Funktionen zur Verfügung, da es eher als Sprache für Zeichenketten- und Dateiverarbeitung konzipiert ist. Es gibt jedoch mächtige Module, die Perl auch zu einer mathematisch mächtigen Sprache machen. Beachten Sie neben den hier beschriebenen Funktionen deshalb auch die Standardmodule, die sich problemlos einbinden lassen und viele weitere interessante Funktionen für mathematisch-naturwissenschaftliche und kaufmännische Berechnungen zur Verfügung stellen.
Erwartet als Parameter:
1. eine beliebige erlaubte Zahl.
Gibt den positiven Wert der Zahl zurück, falls sie negativ ist. Ist die Zahl positiv, wird sie unverändert zurückgegeben.
Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my @Zahlen = (1463.45,2038.02,-12348.12,5671.12,-4939.48,-1124.09); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test</title></head><body>\n"; print "<table border=\"1\">\n"; print "<tr><th>schwarze Zahlen</th><th style=\"color:red\">rote Zahlen</th></tr>\n"; foreach my $Zahl (@Zahlen) { if($Zahl >= 0) { print "<tr><td>$Zahl</td><td style=\"color:red\"> </td></tr>\n"; } else { my $Abszahl = abs($Zahl); print "<tr><td> </td><td style=\"color:red\">$Abszahl</td></tr>\n"; } } print "</table>\n"; print "</body></html>\n";
Das Beispiel definiert eine Liste @Zahlen
. Einige der Zahlen sind positiv, andere negativ. Anschließend wird HTML-Code ausgegeben. Dabei wird eine Tabelle mit zwei Spalten erzeugt. Links stehen positive (schwarze) Zahlen, rechts negative (rote) Zahlen. Die roten Zahlen sollen ohne das Minusvorzeichen, aber eben in roter Färbung dargestellt werden. Deshalb wird, falls eine Zahl negativ ist, die Funktion abs
auf die Zahl angewendet. Das Ergebnis wird in dem Skalar $Abszahl
gespeichert und ausgegeben.
Erwartet als Parameter:
1. eine beliebige erlaubte Zahl x,
2. eine beliebige erlaubte Zahl y.
Gibt den Arcus Tangens von x durch y zurück.
Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test</title></head><body>\n"; my $Wert = atan2(1.394,5.01); print "Der Arcus Tangens von 5.01 durch 1.394 lautet $Wert\n"; print "</body></html>\n";
Das Beispiel übergibt der Funktion atan2
die beiden Gleitkommazahlen 1.394 und 5.01. Die Funktion gibt den Arcus Tangens von 1.394/5.01 zurück. Zur Kontrolle wird HTML-Code mit dem Ergebnis ausgegeben.
Erwartet als Parameter:
1. eine beliebige erlaubte Zahl.
Gibt den Cosinus der Zahl zurück.
Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test</title></head><body>\n"; my $Eins = cos(0); print "1 bleibt $Eins, wie bedingt bedacht\n"; print "</body></html>\n";
Das Beispiel erzeugt die Zahl 1 aus dem Cosinus von 0 (dessen Ergebnis 1 ist). Zur Kontrolle wird HTML-Code mit der Zahl in einem entfernt an Karneval erinnernden Sinnspruch ausgegeben.
Erwartet als Parameter:
1. eine beliebige erlaubte Zahl.
Gibt den Exponentialwert der Zahl zurück.
Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test</title></head><body>\n"; my $x = exp(1); print "x = $x\n"; print "</body></html>\n";
Das Beispiel erzeugt HTML-Code. Dabei wird der Exponentialwert von 1 ermittelt und in dem Skalar $x
gespeichert. Das Ergebnis wird ausgegeben.
Konvertiert einen als Zeichenkette vorliegenden Hexadezimalwert in eine entsprechende Dezimalzahl.
Erwartet als Parameter:
1. eine Zeichenkette, die einen gültigen Hexadezimalwert darstellt, also beispielsweise "0xB56A"
oder "B56A"
.
Gibt den entsprechenden Dezimalwert als numerischen Wert zurück.
Anzeigebeispiel: So sieht's aus - mit dem Übergabeparameter 336699 für Dunkelblau
(Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my $Farbe = $ENV{'QUERY_STRING'}; my $RotwertHex = substr($Farbe,0,2); my $GruenwertHex = substr($Farbe,2,2); my $BlauwertHex = substr($Farbe,4,2); my $RotwertDez = hex($RotwertHex); my $GruenwertDez = hex($GruenwertHex); my $BlauwertDez = hex($BlauwertHex); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test</title></head><body>\n"; print "Die Farbe #$Farbe hat folgende RGB-Anteile:<br>\n"; print "Rotwert: $RotwertDez<br>\n"; print "Grünwert: $GruenwertDez<br>\n"; print "Blauwert: $BlauwertDez<br>\n"; print "</body></html>\n";
Das Beispiel-CGI-Script erwartet einen Übergabeparameter, der beim Aufruf über einen URI hinter einem Fragezeichen notiert wird. Der Übergabeparameter besteht aus einer HTML-typischen Farbangabe, jedoch ohne das einleitende Gatterzeichen #. Beispiel:
http://localhost/cgi-bin/test.pl?FF9933
.
Das Beispiel-Script ermittelt den übergebenen Parameter aus der CGI-Umgebungsvariablen QUERY_STRING und speichert den Wert im Skalar $Farbe
. Mit Hilfe der Funktion substr werden die Anteile für Rot, Grün und Blau aus der hexadezimalen Angabe extrahiert. Wenn die übergebene Zahl beispielsweise FF9933 lautet, wird in $RotwertHex
der Wert "FF"
gespeichert, in $GruenwertHex
der Wert "99"
und in $BlauwertHex
der Wert "33"
. Aus diesen Hexadezimalangaben wird durch Anwendung der Funktion hex
jeweils der entsprechende dezimale Farbanteil ermittelt. Das Beispiel gibt die ermittelten Farbanteile aus.
Die Funktion dient einerseits dazu, den Ganzzahlanteil einer Kommazahl vom Nachkommateil zu trennen. Andererseits kann sie auch auf Zeichenketten angewendet werden. Dann interpretiert sie die Zeichenkette so lange, bis sie auf ein Zeichen stößt, das nicht mehr numerisch interpretiert werden kann.
Erwartet als Parameter:
1. eine Zahl oder Zeichenkette.
Liefert den als Ganzzahl interpretierbaren Teil der übergebenen Daten zurück.
Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my $Ganzzahl = 23; my $Kommazahl = 3.1415; my $Minuszahl = -3.999; my $Ganzzahl_Int = int($Ganzzahl); my $Kommazahl_Int = int($Kommazahl); my $Minuszahl_Int = int($Minuszahl); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; print "$Ganzzahl nach Anwendung von int: $Ganzzahl_Int<br>\n"; print "$Kommazahl nach Anwendung von int: $Kommazahl_Int<br>\n"; print "$Minuszahl nach Anwendung von int: $Minuszahl_Int\n"; print "</body></html>\n";
Das Beispiel definiert verschiedene Skalare: eine normale Ganzzahl, eine Kommazahl und eine negative Zahl, ebenfalls eine Kommazahl. Daraufhin wird auf jeden der Skalare die Funktion int
angewendet. Die Rückgabewerte werden in eigenen, neuen Skalaren gespeichert. Zur Kontrolle wird HTML-Code mit den Werten vor und nach Anwendung der int
-Funktion ausgegeben.
Erwartet als Parameter:
1. eine beliebige erlaubte Zahl.
Gibt den natürlichen Logarithmus der Zahl zurück.
Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my $Eins = log(exp(1)); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; print "$Eins"; print "</body></html>\n";
Im Beispiel wird ein Skalar $Eins
definiert. Diesem Skalar wird das Ergebnis der Funktionlog
zugewiesen. Die Zahl, die dieser Funktion übergeben wird, ist im Beispiel der Rückgabewert der Funktion exp, angewendet auf die Zahl 1. Da exp
die Umkehrfunktion von log
ist, ist das Ergebnis des verschachtelten Aufrufs beider Funktionen der Wert 1. Zur Kontrolle wird HTML-Code mit dem Ergebnis ausgegeben.
Konvertiert einen als Zeichenkette vorliegenden Oktalwert in eine entsprechende Dezimalzahl.
Erwartet als Parameter:
1. eine Zeichenkette, die einen gültigen Oktalwert darstellt, also beispielsweise "755"
oder "0755"
.
Gibt den entsprechenden Dezimalwert als numerischen Wert zurück.
Anzeigebeispiel: So sieht's aus - mit der Rechteangabe 755 als Übergabeparameter
(Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my $UnixRechtOct = $ENV{'QUERY_STRING'}; my $DezRecht = oct($UnixRechtOct); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; print "Die Dezimaldarstellung der Unix-Rechteangabe $UnixRechtOct lautet $DezRecht\n"; print "</body></html>\n";
Ein typischer bekannter Anwendungsfall für Oktalwerte sind die Rechtevergaben für User, Group und World im Unix-Dateisystem. Das Beispiel-CGI-Script erwartet so eine typische oktale Rechteangabe und ermittelt daraus den entsprechenden Dezimalwert. Dazu erwartet das Script einen Übergabeparameter, der beim Aufruf über einen URI hinter einem Fragezeichen notiert wird. Der Übergabeparameter besteht aus einem Oktalwert. Beispiel:
http://localhost/cgi-bin/test.pl?0755
.
Das Script ermittelt den übergebenen Parameter aus der CGI-Umgebungsvariablen QUERY_STRING
und speichert den Wert im Skalar $UnixRechtOct
. Dieser Skalar wird wiederum der Funktion oct
übergeben, die eine Dezimalzahl daraus erzeugt, die in $DezRecht
gespeichert wird. Zur Kontrolle gibt das Script die beiden Werte aus.
Ermittelt eine Zufallszahl zwischen 0 und 1, wenn kein Parameter übergeben wird, oder eine Zufallszahl zwischen 0 inklusive und der Zahl n
exklusive, wenn n
als Parameter übergeben wird. Das Ergebnis ist eine Gleitpunktzahl.
Erwartet als Parameter:
1. (optional) eine Zahl. Wenn angegeben, wird eine Zufallszahl zwischen 0 und dieser Zahl ermittelt, ansonsten zwischen 0 und 1.
Gibt die ermittelte Zufallszahl zurück.
Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my @Zahlen; for(my $i = 0; $i < 7; $i++) { $Zahlen[$i] = int(rand(49) + 1); } my @Lottozahlen = sort(NummernSort @Zahlen); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; print "Der Lottotip von Perl lautet:<br>\n"; print "$Lottozahlen[0], $Lottozahlen[1], $Lottozahlen[2], $Lottozahlen[3], $Lottozahlen[4], $Lottozahlen[5]<br>\n"; print "Die Zusatzzahl lautet: $Lottozahlen[6]\n"; print "</body></html>\n"; sub NummernSort { if($a < $b) { return -1; } elsif($a == $b) { return 0; } else { return 1; } }
Das Script nimmt Ihnen die Entscheidung ab, sich Lottozahlen auszudenken. Es ermittelt 7 Zahlen (6 plus Zusatzzahl) zwischen 1 und 49. Die Zahlen werden in einer for-Schleife ermittelt. Damit wirklich ganze Zahlen zwischen 1 und 49 gefunden werden, wird dem Aufruf der rand
-Funktion die Zahl 49 als Parameter übergeben. Damit werden jedoch nur Zahlen zwischen 0.0x und 48.9x ermittelt. Durch Hinzuzählen von 1 sind es Zahlen zwischen 1.0x und 49.9x. Indem auf diese gesamte Operation dann noch die Funktion int angewendet wird, kommen ganze Zahlen zwischen 1 und 49 heraus.
Um die Zahlen schön sortiert auszugeben, wird noch die Funktion sort angewendet. Da es sich um eine numerische Sortierung handelt, benutzt das Script auch die Hilfsfunktion für numerische Sortierung.
Das Script gibt die ermittelten Lottozahlen aus.
Bei dieser Art von Zufallszahlerzeugung handelt es sich nicht um "echte" Zufallszahlen, sondern um Pseudo-Zufallszahlen, die aufgrund eines Anfangswertes mit Hilfe eines Algorithmus erzeugt werden. Sie können diesen Anfangswert auch selbst bestimmen. Dazu dient die Funktion srand.
Erwartet als Parameter:
1. eine beliebige erlaubte Zahl.
Gibt den Sinus der Zahl zurück.
Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my $x = 2; my $Fx = sin($x) + sin(2*$x) - sin(3*$x) + sin(4*$x) - sin(5*$x) + 0.3*sin(25*$x); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; print "$Fx\n"; print "</body></html>\n";
Das Beispiel zeigt eine Mehrfachanwendung der Funktion sin
innerhalb einer Berechnung. Das Script gibt das Ergebnis der Berechnung aus.
Erwartet als Parameter:
1. eine beliebige Zahl größer 0.
Gibt die Quadratwurzel der Zahl zurück.
Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; for(my $i = 1; $i <= 1000; $i++) { my $Wurzel = sqrt($i); if($Wurzel == int($Wurzel)) { print "Quadratzahl von $Wurzel ist $i<br>\n"; } } print "</body></html>\n";
Das Beispiel-Script gibt HTML-Code aus. Dabei wird in einer for-Schleife für die Zahlen 1 bis 1000 mit sqrt
die Quadratwurzel ermittelt und jeweils in dem Skalar $Wurzel
gespeichert. Dann wird der darin gespeicherte Wert daraufhin abgefragt, ob er mit der Ganzzahl dieses Wertes identisch ist. Zu diesem Zweck wird die Funktion int angewendet.
Wenn $Wurzel
und int($Wurzel)
identisch sind, handelt es sich bei dem aktuellen Schleifenwert von $i
um eine Quadratzahl. Ist das im Beispiel der Fall, wird eine entsprechende Zeile ausgegeben. Auf diese Weise gibt das Script alle Quadratzahlen zwischen 1 und 1000 aus.
Wenn Sie mit rand Zufallszahlen erzeugen, benötigt Perl intern einen Initialisierungswert. Wenn Sie selber keinen Wert angeben, ermittelt Perl automatisch einen. Sie können den Wert jedoch auch selber angeben.
Erwartet als Parameter:
1. eine beliebige erlaubte Ganzzahl bzw. eine Zahl, von der der Ganzzahlanteil verwendet wird.
Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); srand(42); my $Zufall_1 = rand(); my $Zufall_2 = rand(); srand(42); my $Zufall_3 = rand(); my $Zufall_4 = rand(); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; print "Zufall 1: $Zufall_1<br>\n"; print "Zufall 2: $Zufall_2<br>\n"; print "Zufall 3: $Zufall_3<br>\n"; print "Zufall 4: $Zufall_4\n"; print "</body></html>\n";
Das Beispiel verdeutlicht die Wirkungsweise von srand
und den folgenden Aufrufen von rand
. srand
wird zweimal mit demselben Wert, nämlich mit der Zahl 42, initialisiert. Anschließend wird jeweils zweimal die Funktion rand
aufgerufen, und die ermittelten Zufallswerte werden jeweils in eigenen Skalaren gespeichert. Das Beispiel gibt die vier Skalare aus. Die Werte von $Zufall_1
und $Zufall_3
sind dabei gleich, ebenso die Werte von $Zufall_2
und $Zufall_4
. Und das ist kein Zufall, sondern die Folge der Tatsache, dass jede bestimmte srand
-Initialisierung die gleiche Serie von Zufallszahlen bei jedem anschließenden rand
-Aufruf erzeugt.
Funktionen für die Kontrolle des laufenden Scripts | |
Funktionen für Listen bzw. Arrays und Hashes | |
SELFHTML/Navigationshilfen Perl Perl-Funktionen |
© 2007 Impressum