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? "; $text = <STDIN>; chomp($text); open(file, ">test.txt") or die "Fehler beim Öffnen der Datei: $!\n"; 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.
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; }

