Perl-Programmierung: Einfache Beispiele

Aus Wikibooks


Fallunterscheidung[Bearbeiten]

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";

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[Bearbeiten]

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";

Umwandlung in HTML[Bearbeiten]

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 = (
        ['ä',      'ö',      'ü',      'Ä',      'Ö',      'Ü',      'ß'],
  	['&auml;', '&ouml;', '&uuml;', '&Auml;', '&Ouml;', '&Uuml;', '&szlig;'],
  	['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 = (
        [   'ä',   'ö',      'ü',      'Ä',      'Ö',     'Ü',      'ß'],
        ['&auml;', '&ouml;', '&uuml;', '&Auml;', '&Ouml;','&Uuml;', '&szlig;'],
        [   '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[Bearbeiten]

Dieses 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;
 }