Perl-Programmierung: Einfache Beispiele
Aus Wikibooks
Inhaltsverzeichnis |
[Bearbeiten] Fallunterscheidung
Ein 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";
[Bearbeiten] Stringvergleiche
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"; }
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 ...;
[Bearbeiten] Dateihandling
Ausgabe 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";
[Bearbeiten] Umwandlung in HTML
Funktion 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.
[Bearbeiten] Erzeugung von SQL-Code
Dieses Script wird benötigt 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.
- Achtung: Die Namen der Tabellen und Spalten der Beispieldatenbank wurden inzwischen überarbeitet (Tabellen als Singular, Spaltennamen ohne Präfix, einzelne Namen geändert). Vor der Benutzung des folgenden Skripts müssen deshalb die Bezeichnungen geprüft und angepasst werden. Da ich nicht weiß, ob das folgende Skript auch für andere Zwecke genutzt wird, wage ich keine direkte Änderung. Juetho
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(VNE_NAME, VNE_VORNAME, VNE_GEBURTSDATUM, VNE_DATUM_FUEHRERSCHEIN, VNE_ORT, VNE_PLZ, VNE_STRASSE, VNE_HAUSNUMMER, VNE_EIGENER_KUNDE_J_N, VNE_VERSGESELLSCHAFT_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 SCHADENSFAELLE(SCF_DATUM, SCF_ORT, SCF_BESCHREIBUNG, SCF_SCHADENSHOEHE, SCF_VERLETZTE_J_N, SCF_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 ZUORD_VNE_SCF(ZVS_SCHADENSFALL_ID, ZVS_VERSICHERUNGSNEHMER_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; }