![]() |
Funktionen für Berechnungen |
|
|
|
| | |
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.
|
| |
© 2007
Impressum