Perl-Programmierung: Einfache Beispiele

Aus Wikibooks

Wechseln zu: Navigation, Suche
Wikibooks buchseite.svg Zurück zu CPAN | One wikibook.svg Hoch zu Inhaltsverzeichnis | Wikibooks buchseite.svg Vor zu Funktionsreferenz


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 = (
        ['ä',      'ö',      'ü',      'Ä',      'Ö',      'Ü',      'ß'],
  	['&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.

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


Wikibooks buchseite.svg Zurück zu CPAN | One wikibook.svg Hoch zu Inhaltsverzeichnis | Wikibooks buchseite.svg Vor zu Funktionsreferenz


Persönliche Werkzeuge