Perl-Programmierung: Einfache Beispiele
Fallunterscheidung
BearbeitenEin Beispiel für eine if/elseif/else-Struktur
#!/usr/bin/perl -w
# if/elsif/else
# 20041110
if (1233 > 2333) {
print "Ergebnis 1\n";
}
elsif (3333 > 4444) {
print "Ergebnis 2\n";
}
else {
print "Ergebnis 3\n";
}
# ergibt: Ergebnis 3
# das selbe ohne if/elsif/else (TIMTOWTDI-Prinzip)
print "Ergebnis ", 1233 > 2333 ? 1 : 3333 > 4444 ? 2 : 3, "\n";
Ein Beispiel für den Vergleich von Strings
#!/usr/bin/perl -w
# Stringvergleich eq, ne (equal, not equal)
if ("huhu" eq "huhu") {
print "beide Zeichenketten gleich";
}
if ("wiki" ne "books") {
print "strings sind unterschiedlich";
}
Vergleiche mit String-Variablen
Bearbeiten#!/usr/bin/perl
#@potbot
#Vergleich mit Variablen/String (If/else)
#Usereingabe mit -> String-Variable
print"Wie heißt der Erfinder dieser schönen Sprache?\n";
$userinput=<STDIN>; # Variable in der die Usereingabe gespeichert wird. <STDIN>=Standard-Input.
$var1='Larry Wall'; # Vergleichsvariable mit dem String-Wert 'Larry Wall'.
chomp($userinput); # Chomp entfernt den Zeilenumbruch von der Usereingabe. Wichtig!
if ($userinput eq $var1){ # String-Vergleiche immer mit 'eq'(equal) oder 'ne'(not equal).
print"Richtige Antwort! :D\n";
}
else {
print"Hmm, wer hat denn hier nicht aufgepasst?! ;D\n";
}
#--~~~~
Ein weiteres Beispiel
#!/usr/bin/perl -w
# 20041110
print "1+1 = 4\n" if 1+1 == 2;
something else
#!/usr/bin/perl -w
print "\aAlarm\n"; # \a gibt einen Piepton aus, es folgt die Zeichenkette 'Alarm'
# und \n gibt eine neue Zeile aus;
print `hostname`; # fuehrt das Kommando "hostname" in einer Shell aus und liest
# die Standardausgabe der Shell und zeigt diese als Resultat
# an. "hostname" ist also kein Perl-Befehl!;
$var0 = "0123456789";
print substr($var0, 3, 5); # gibt '34567' aus; substr holt aus $var0 von Zeichen nr.3 die
# darauf folgenden 5 Zeichen und gibt sie aus ...;
Dateihandling
BearbeitenAusgabe des Inhaltes von $text in die Datei test.txt
#!/usr/bin/perl
print "Wie heißt Du? ";
#aus der Standardeingabe lesen
$text = <STDIN>;
#letztes Zeichen von $text (\n) entfernen
chomp($text);
open(file, ">test.txt") or die "Fehler beim Öffnen der Datei: $!\n";
#$text in file schreiben
print file $text;
close (file) or die "Fehler beim Schließen von 'test.txt': $! \n";
Umwandlung in HTML
BearbeitenFunktion zur Umwandlung von Umlauten in deren HTML-Äquivalente. Alternativ können diese mit dem Zusatzparameter '2' auch in der Doppellautschreibweise dargestellt werden. Die ganze Funktion kann in eine Bibliotheks-Datei im cgi-bin-Verzeichnis ausgelagert werden, um dann bei Bedarf von allen CGI-Perl-Dateien mit "require" eingebunden zu werden.
sub umlautwechseln {
my $return = $_[0]; # erster Parameter
my $matchcode = $_[1]; # zweiter Parameter
if(!defined($matchcode)) {
$matchcode = 1;
}
my @vorlage = (
['ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß'],
['ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß'],
['ae', 'oe', 'ue', 'Ae', 'Oe', 'Ue', 'ss']
);
my $vorlage = 0;
for (my $i=0; $i<=6; $i++) { # alternativ: for ( 0 .. 6 )
while ( index($return, $vorlage[0][$i], 0) > -1 ) {
substr ($return, index($return, $vorlage[0][$i], 0), 1) = $vorlage[$matchcode][$i];
}
}
return $return;
}
1;
Das selbe Beispiel könnte ebenfalls mit Regular-Expressions gelöst werden, wie man im folgenden Beispiel sehen kann:
#!/usr/bin/perl
use strict;
use warnings;
sub umlautwechseln {
my $messystring = shift;
my $conversion = shift || "1";
my @vorlage = (
[ 'ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß'],
['ä', 'ö', 'ü', 'Ä', 'Ö','Ü', 'ß'],
[ 'ae', 'oe', 'ue', 'Ae', 'Oe', 'Ue', 'ss']
);
for (0 .. 6) {
$messystring =~ s/$vorlage[0][$_]/$vorlage[$conversion][$_]/g;
}
return $messystring;
}
Erläuterung der Funktion:
Diese Funktion erwartet 2 Parameter, wobei der zweite Parameter optional ist ( $conversion ). Falls der zweite Parameter nicht angegeben wird, wird der Wert "1" angenommen. Der erste Parameter ist der Skalar mit den Sonderzeichen.
In Zeile 16 erfolgt die eigentliche Arbeit. $messystring wird mittels RegEx untersucht und entsprechende Treffer werden ersetzt.
Erzeugung von SQL-Code
BearbeitenDieses Script kann genutzt werden für die Beispieldatenbank der Einführung in SQL. Es erzeugt etwas mehr als 100.000 SQL-Anweisungen für MySQL, die mit einer Kanalumleitung in die Beispieldatenbank eingespielt werden können, und dort jeweils einen Datensatz erzeugen.
Hinweis: Die Tabellen wurden inzwischen geändert, siehe Anmerkungen zur Beispieldatenbank. Bitte beachten Sie, dass im Laufe der Arbeit mit Änderung der Datenbankstruktur weitere Spalten angelegt werden und danach auch dafür Werte benötigt werden.
Für die Beispieldatenbank fehlen Datensätze für die Tabellen Fahrzeug und Versicherungsnehmer. In der jetzigen Version des folgenden Skripts werden die Bedingungen der Fremdschlüssel (ForeignKeys) verletzt. |
Für Perl-Neulinge von Interesse sind vermutlich eher
- die Verwendung der ForEach-Schleife,
- die alternative Textausgabe, die besonders für längere Texte geeignet ist,
- der alternative Zugriff auf die Datenbank, der ohne das DBI-Modul auskommt.
#!/usr/bin/perl
use strict;
my @namen=("Meyer", "Müller", "Schulze", "Schneider", "Schubert", "Lehmann",
"Bischof", "Kretschmer", "Kirchhoff", "Schmitz", "Arndt");
my @vornamen=("Anton", "Berta", "Christoph", "Dieter", "Emil", "Fritz", "Gustav",
"Harald", "Ida", "Joachim", "Kunibert", "Leopold", "Martin", "Norbert", "Otto",
"Peter", "Quentin", "Richard", "Siegfried", "Theodor", "Ulf", "Volker", "Walter",
"Xaver", "Yvonne", "Zacharias");
my @orte=("Essen", "Dortmund", "Bochum", "Mülheim", "Duisburg", "Bottrop",
"Oberhausen", "Herne", "Witten", "Recklinghausen", "Gelsenkirchen",
"Castrop-Rauxel", "Hamm", "Unna", "Herten", "Gladbeck");
my $orte="";
my @strassen=("Goethestr.", "Schillerstr.", "Lessingstr.", "Badstr.", "Turmstr.",
"Chausseestr.", "Elisenstr.", "Poststr.", "Hafenstr.", "Seestr.", "Neue Str.",
"Münchener Str.", "Wiener Str.", "Berliner Str.", "Museumsstr.", "Theaterstr.",
"Opernplatz", "Rathausplatz", "Bahnhofstr.", "Hauptstr.", "Parkstr.",
"Schlossallee");
my @gesellschaften=("Zweite allgemeine Verabsicherung", "Sofortix
Unfallversicherung", "Buvaria Autofutsch", "Provinziell", "Vesta Blanca");
my @beschreibungen=("Standardbeschreibung Nr 502", "08/15", "Blablabla",
"Der andere war schuld!", "Die Ampel war schuld!", "Die Sonne war schuld!",
"Die Welt ist schlecht!!");
my $beschreibungen="";
my $gesellschaften=0;
my $gebdat="";
my $fdat="";
my $hnr=0;
my $eigen="";
foreach my $ort (@orte) {
my $gplz=int(rand(90000))+10000;
foreach my $strasse (@strassen) {
my $plz=$gplz+int(rand(20));
foreach my $name (@namen) {
foreach my $vorname(@vornamen) {
$gebdat=dating(80, 1907);
$fdat=dating(80, 1927);
$hnr=int(rand(100))+1;
if(rand(2)>1) {$eigen="TRUE";} else {$eigen="FALSE";}
my $vers=int(rand(5));
print <<OUT1
insert into VERSICHERUNGSNEHMER(NAME, VORNAME, GEBURTSDATUM,
FUEHRERSCHEIN, ORT, PLZ, STRASSE, HAUSNUMMER,
EIGENER_KUNDE, VERSICHERUNGSGESELLSCHAFT_ID) values ("$name",
"$vorname", "$gebdat", "$fdat", "$ort", "$plz", "$strasse", "$hnr", "$eigen",
"$vers");
OUT1
}}}}
for(my $a=0; $a<=500; $a++)
{
my $udat=dating(3, 2004);
my $ort=$orte[int(rand(16))];
my $beschreibung=$beschreibungen[int(rand(7))];
my $shoehe=int(rand(20000000))/100;
my $verletzte;
if(rand(2)>1) {$verletzte="TRUE";} else {$verletzte="FALSE";}
my $mitarbeiter=int(rand(10))+1;
print <<OUT2
insert into SCHADENSFALL(DATUM, ORT, BESCHREIBUNG,
SCHADENSHOEHE, VERLETZTE, MITARBEITER_ID) values
("$udat", "$ort", "$beschreibung", $shoehe, "$verletzte", $mitarbeiter);
OUT2
}
for(my $a=1; $a<=500; $a++)
{
my $vne=int(rand(100000))+1;
print <<OUT3
insert into ZUORDNUNG_SF_FZ(SCHADENSFALL_ID, FAHRZEUG_ID) values
($a, $vne);
OUT3
}
sub dating
{
my $range=$_[0];
my $radix=$_[1];
my $y=int(rand($range))+$radix;
my $m=int(rand(12))+1;
my $d=int(rand(28))+1;
my $return=$y . "-" . $m . "-" . $d;
return $return;
}