Homepage Inspire-world | Forum
CGI/Perl Workshops Arbeiten mit Arrays - Praxisnahe Beispiele

 Inhaltsverzeichnis/Workshops Übersichtsseite/Arbeiten mit Arrays - Praxisnahe Beispiele
Im zweiten Teil des Workshops will ich einige Praxisnahe Beispiele als komplette Scripte vorstellen. Alle Scripte sind an den relevanten Stellen kommentiert.

Alle Scriptbeispiele bauen auf einer fiktiven Mitgliederdatei auf die im ersten Scriptbeispiel dargestellt wird.
1. Beispiel, auslesen einer Mitgliederdatei wobei Zeile 1 die Spaltennamen beinhaltet.

Die Mitgliederdatei:
Name|Vorname|Datum|Land|Männlich/Weiblich
Walter|Helmut|2004.02.02|Deutschland|M
Meyer|Lisa|2003.12.28|Deutschland|W
Müller|Maximilian|2002.05.22|Schweiz|M
Lehmann|Hubert|2002.11.01|Oesterreich|M
Schulze|Stefanie|2004.01.04|Deutschland|W
Wolter|Willy|2002.06.09|Oesterreich|M
Thomas|Eva-Maria|2004.01.17|Schweiz|W
Schneyder|Jean|2001.09.04|Frankreich|M
Clerc|Pascale|2002.11.17|Frankreich|M
Benguerel|Sebastian|2003.08.10|Spanien|M
Carl|Johanna|2002.10.01|Deutschland|W

Ziel der Übung soll eine solche Ausgabe sein:



Das komplette Script:
#!/usr/bin/perl
#Fehlerausgabe an Browser
use CGI::Carp qw(fatalsToBrowser);

# Dateiflockmodul einbinden
use Fcntl qw(:DEFAULT :flock);

# Header ausgeben
print "Content-type: text/html\n\n";

# HTML Kopf bis Body ausgeben Dabei kann das was zwischen print qq~ ... ~; steht als 
# Normales HTML notiert werden, die " oder die ' Zeichen 
# brauchen hier nicht mit vorangestelltem \" notiert werden.
print qq~
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<title>Namensliste</title>
<style type="text/css">
<!--
th,td {
font-family: Verdana, Arial;
font-size: 11px;
padding: 3px;
color: #000000;
}
-->
</style>
</head>
<body>
~;

# Datei oeffnen und Inhalt in Array @mitglieder ablegen
open (DATEI, "<namensliste.dat") || scripterror("Datei namensliste.dat kann nicht gelesen werden: $!\n");
flock (DATEI, 2);
@mitglieder = <DATEI>;
close DATEI;

# Tabellentitel aus erster Zeile der Datei lesen
# Name|Vorname|Datum|Land|Männlich/Weiblich

($titelname, $titelvorname, $titeldatum, $titelland, $titelmw) = split(/\|/, $mitglieder[0]);

# Tabellenkopf ausgeben Dabei kann das was zwischen print qq~ ... ~; steht als 
# Normales HTML notiert werden, die " oder die ' Zeichen 
# brauchen hier nicht mit vorangestelltem \" notiert werden.
 
print qq~
<table cellpadding="2" cellspacing="1" border="0">
<tr>
<th bgcolor="#c5aa74">$titelname</td>
<th bgcolor="#c5aa74">$titelvorname</td>
<th bgcolor="#c5aa74">$titeldatum</td>
<th bgcolor="#c5aa74">$titelland</td>
<th bgcolor="#c5aa74">$titelmw</td>
</tr>
~;

# Hier beginnt nun die for Schleife.
# $i=1 wird auf den Startwert 1 gesetzt um bei Zeile 2 mit
# dem Durchlauf zu beginnen. Zur Erinnerung $i=1 weil ein Arrayindex
# mit 0 beginnt, ergo entspricht 1 der zweite Zeile 


for ($i=1; $i <=$#mitglieder; $i++) {
chomp($mitglieder[$i]); # \n am Zeilenende weg
# splitten der Zeilen
($name,$vorname,$datum,$land,$mw) = split(/\|/, $mitglieder[$i]);

# Hier begint die HTML Ausgabe
print qq~
<tr>
<td bgcolor="#ede7d8">$name</td>
<td bgcolor="#ede7d8">$vorname</td>
<td bgcolor="#ede7d8">$datum</td>
<td bgcolor="#ede7d8">$land</td>
<td bgcolor="#ede7d8">$mw</td>
</tr>
~;
} # ende der for Schleife

# Ausgabe des Tabellenendes
print "</table>\n";
# Ausgabe Seitenende
print "</body></html>\n";

# Scripterror Subroutine
sub scripterror {
$fehler = $_[0];
print "<font color=\"red\">$fehler</font>";
exit;
}

2. Beispiel, auslesen einer Mitgliederdatei die Tabellenreihen abwechselnd andersfarbig dargestellt werden sollen.

Ziel der Übung soll eine solche Ausgabe sein:



Die Teile des ersten Scriptes die verändert werden müssen:
# Festlegen der Farben für den Farbwechsel der Tabellenreihen
$farbe1 = "#ffffff";
$farbe2 = "#ede7d8";

for ($i=1; $i <=$#mitglieder; $i++) {
chomp($mitglieder[$i]); # \n am Zeilenende weg
# splitten der Zeilen
($name,$vorname,$datum,$land,$mw) = split(/\|/, $mitglieder[$i]);

# Dies ist der Code der den Tabellenreihen abwechselnd 
# eine andere Hintergrundfarbe zuweist.
# Man liest den Code wie ein If-Else Konstrukt
# "Gesprochen" würde man das so erklären:
# Wenn Hintergrundfarbe eq (gleich) #ffffff ist setze nächste Hintergrundfarbe auf  
# Farbe $farbe2  und dann wieder $farbe1
$bgcolor = $bgcolor eq $farbe1 ? $farbe2 : $farbe1;

# Hier begint die HTML Ausgabe
# Die Werte für die Hintergrundfarbe wurden 
# durch die Variable $bgcolor ersetzt 

print qq~
<tr>
<td bgcolor="$bgcolor">$name</td>
<td bgcolor="$bgcolor">$vorname</td>
<td bgcolor="$bgcolor">$datum</td>
<td bgcolor="$bgcolor">$land</td>
<td bgcolor="$bgcolor">$mw</td>
</tr>
~;
} # ende der for Schleife
Diese Schreibweise:
$wert = $variable (Ausdruck) ? "so" : "oder so"; bietet vielfältige Möglichkeiten. Ändert man den Code so ab:
$bgcolor = $mw eq 'M' ? $farbe2 : $farbe1; erhält man diese Tabellenausgabe:

Warum, nun weil hier der Ausdruck $mw eq 'M' dafür sorgt das die Datenzeilen der männlichen Mitglieder und die der weiblichen andere Hintergrundfarben erhalten. Selbiges könnte man mit den anderen Werten auch tun. Einfach mal experimentieren...

3. Beispiel, auslesen einer Mitgliederdatei wobei mittels einer IF Abfrage entweder weibliche oder männliche Mitglieder angezeigt werden sollen.

Zusätzlich soll die Anzahl der ausgegebenen Mitglieder gezählt werden.

Ziel der Übung soll eine solche Ausgabe sein:





So muss das Ausgangsscript modifiziert werden um obige Ausgaben zu erzeugen.
# Anlegen einer Zählvariable mit dem Wert 0
$anzahl = 0;

for ($i=1; $i <=$#mitglieder; $i++) {
chomp($mitglieder[$i]); # \n am Zeilenende weg
# splitten der Zeilen
($name,$vorname,$datum,$land,$mw) = split(/\|/, $mitglieder[$i]);

# Mit dieser IF Abfrage werden nur die Zeilen dargestellt
# deren Wert (eq = gleich) W ist
# Notiert man hier anstatt W ein M werden alle männlichen Mitglieder aufgelistet
if ($mw eq 'W') {

# Um die Ausgabe am Tabellenende entsprechend anzupassen hier
# ein ähnlicher Code wie für die Tabellenwechselfarben.
# nur soll hier entweder der Wert weibliche oder männliche
# der Variable $mwmember  zugewiesen werden
$mwmember = $mw eq 'W' ? "weibliche" : "männliche";

# Die Tabellenwechselfarben
$bgcolor = $bgcolor eq $farbe2 ? $farbe1 : $farbe2;

# Beim durchlauf durch die for Schleife wird nun hier 
# die Zählvariable um 1 erhöht.  
$anzahl++;
# Hier begint die HTML Ausgabe
print qq~
<tr>
<td bgcolor="$bgcolor">$name</td>
<td bgcolor="$bgcolor">$vorname</td>
<td bgcolor="$bgcolor">$datum</td>
<td bgcolor="$bgcolor">$land</td>
<td bgcolor="$bgcolor">$mw</td>
</tr>
~;
} # Ende If

} # ende der for Schleife


# Ausgabe des Tabellenendes
# Hier wurde eine zusätzliche Tabellenreihe eingefügt 
# die die entsprechende Mitgliederzahl ausgibt 
print "<tr><td colspan=\"5\" bgcolor=\"#dfdfdf\">Es gibt $anzahl $mwmember Mitglieder</td></tr>\n";
print "</table>\n";

# Ausgabe Seitenende
print "</body></html>\n";


 Zum Inhaltsverzeichnis/Workshops Übersichtsseite/Arbeiten mit Arrays - Praxisnahe Beispiele
Autor: Helmut Walter Homepage Inspire-world Fragen, Anregungen und Hinweise bitte in das Forum

Valid HTML 4.0! Valid CSS!