#!/usr/bin/perl use strict; use warnings; use feature ':5.10'; use version; our $VERSION = qv('0.2'); #use CGI qw/:standard/; #use Net::LDAP; my $template_bewertung = 'bewertung.template'; my $file = 'projektdaten.txt'; my (@zeilen, @temp, $nr, @anz_bewertungen_fuer_projekt, @punkte_des_projekts, $max, $gesamtpunkte, @gesamtpunkte_fuer_projekt, @schlechteste_bewertung_fuer_projekt, @beste_bewertung_fuer_projekt, @durchschnittliche_bewertung_fuer_projekt, $temp, %projekt, @sortierte_projektnummern, $zeile, @text); =for Konzept: wir lesen die Projektdaten ein wir bestimmen die Anzahl der Projekte wir initialisieren die Arrays für die Bewertungen wir holen die Liste der Bewertungen für jeden User (also für jede Datei) lesen wir die Datei ein für jede Zeile dieser Datei (also für jede Bewertung eines Projekts) prüfen wir, ob eine korrekte Bewertung vorliegt wenn nicht, ignorieren (da machen wir nichts) sonst Zeile zerlegen (Nummer des Projekts, die 10 "Zensuren") Anzahl der Bewertungen des Projekts incrementieren (um 1 erhöhen) wir wandeln die Zensuren in Punkte um Punktezahlen des Projekts ermitteln (1 => 5 Pkt., ... ) Gesamtpunktezahl für dieser Projekt bei dieser Bewertung (verdoppeln außer Impr., add) beste Punktzahl des Projekts abgleichen schlechteste Punktzahl des Projekts abgleichen Gesamtpunktzahl des Projekts ermitteln (aufaddieren) für jedes Projekt bestimmen wir jetzt die (durchschnittliche) Bewertung für jedes Projekt bestimmen wir jetzt die schlechteste Bewertung für jedes Projekt bestimmen wir jetzt die beste Bewertung wir erstellen einen Hash %projekt mit $nr => $durchschnittliche_bewertung_fuer_projekt[$nr] wir sortieren jetzt die Gruppen nach der "durchschnittlichen" Wertung, die beste zuerst wir erstellen die eigentliche Tabelle mit Nr, Thema, Anzahl, schlechteste, beste, durchschn. wir lesen die Vorlage (Template) ein wir erstellen die HTML-Seite und geben diese aus =cut # wir lesen die Projektdaten ein my ($themen_lref, $urls_lref) = &read_projektdata( $file ); my @themen = @{$themen_lref}; my @urls = @{$urls_lref}; # wir bestimmen die Anzahl der Projekte my $anz_projekte = scalar @themen; # wegen unterschiedlicher Teilnehmerzahl bei den Projekten ist Anzahl der Bewertungen für Projekt nicht gleich! foreach my $i ( 0 .. $anz_projekte-1 ) { $anz_bewertungen_fuer_projekt[$i] = 0; } # die Gesamtpunktzahl für das Projekt wird mit 0 initialisiert foreach my $i ( 0 .. $anz_projekte-1 ) { $gesamtpunkte_fuer_projekt[$i] = 0; } # um die schlechteste Bewertung zu ermitteln wird mit einer hohen Bewertung (95) initialisiert foreach my $i ( 0 .. $anz_projekte-1 ) { $schlechteste_bewertung_fuer_projekt[$i] = 95; } # um die beste Bewertung zu ermitteln wird mit einer niedrigen Bewertung (0) initialisiert foreach my $i ( 0 .. $anz_projekte-1 ) { $beste_bewertung_fuer_projekt[$i] = 0; } # wir holen die Liste der Bewertungen my @dateien_user = &hole_liste_der_bewertungen('wertung'); # für jeden User (also für jede Datei) foreach my $datei ( @dateien_user ) { # lesen wir die Datei ein @zeilen = &lies_datei( 'wertung', $datei ); # für jede Zeile dieser Datei (also für jede Bewertung eines Projekts) foreach my $zeile (@zeilen) { # prüfen wir, ob eine korrekte Bewertung vorliegt, wenn nicht, if ($zeile =~ /::/) { # zwei Doppelpunkte hintereinander = nicht korrekt # dann ignorieren (keine Wertung) } # sonst else { # wir zerlegen die Zeile # Zeile zerlegen (Nummer des Projekts und die 10 "Zensuren") @temp = split /:/, $zeile; # Anzahl der Bewertungen des Projekts incrementieren (um 1 erhöhen) $nr = $temp[0] - 1; # in den Listen beginnt die Zählung bei 0 $anz_bewertungen_fuer_projekt[$nr]++; # wir erstellen jetzt reine Zensurenlisten (Nummer weg) shift @temp; # Punktezahlen des Projekts ermitteln (1 => 5 Pkt., 2 => 4 Pkt., ...) @punkte_des_projekts = &transformiere_zensuren_in_punkte( @temp ); # Gesamtpunktezahl für dieser Projekt bei dieser Bewertung (verdoppeln außer Impr., add) $gesamtpunkte = &bilde_gesamtpunkte_bei_dieser_bewertung( @punkte_des_projekts ); # falls diese Bewertung die bisher schlechteste für das Projekt ist, dann eintragen if ($gesamtpunkte < $schlechteste_bewertung_fuer_projekt[$nr]) { $schlechteste_bewertung_fuer_projekt[$nr] = $gesamtpunkte; } # falls diese Bewertung die bisher beste für das Projekt ist, dann eintragen if ($gesamtpunkte > $beste_bewertung_fuer_projekt[$nr]) { $beste_bewertung_fuer_projekt[$nr] = $gesamtpunkte; } # Gesamtpunktzahl des Projekts ermitteln (aufaddieren) $gesamtpunkte_fuer_projekt[$nr] += $gesamtpunkte; } } } # für jedes Projekt bestimmen wir jetzt die (durchschnittliche) Bewertung foreach my $i ( 0 .. $anz_projekte-1 ) { $temp = $gesamtpunkte_fuer_projekt[$i] / $anz_bewertungen_fuer_projekt[$i]; # durchschnittl. Punkte pro Formular $temp = $temp / 19; # durchschnittl. Punkte pro Frage $temp = 6 - $temp; # umwandeln in "Zensur" $temp = (int($temp * 100)) / 100; # runden auf 2 Stellen nach Komma push @durchschnittliche_bewertung_fuer_projekt, $temp; } # für jedes Projekt bestimmen wir jetzt die schlechteste Bewertung foreach my $i ( 0 .. $anz_projekte-1 ) { $temp = $schlechteste_bewertung_fuer_projekt[$i] / 19; $temp = 6 - $temp; # umwandeln in "Zensur" $temp = (int($temp * 100)) / 100; # runden auf 2 Stellen nach Komma $schlechteste_bewertung_fuer_projekt[$i] = $temp; } # für jedes Projekt bestimmen wir jetzt die beste Bewertung foreach my $i ( 0 .. $anz_projekte-1 ) { $temp = $beste_bewertung_fuer_projekt[$i] / 19; $temp = 6 - $temp; # umwandeln in "Zensur" $temp = (int($temp * 100)) / 100; # runden auf 2 Stellen nach Komma $beste_bewertung_fuer_projekt[$i] = $temp; } # wir erstellen einen Hash %projekt mit $nr => $durchschnittliche_bewertung_fuer_projekt[$nr] foreach my $nr ( 0 .. $anz_projekte-1 ) { $projekt{$nr} = $durchschnittliche_bewertung_fuer_projekt[$nr]; } # wir sortieren jetzt die Gruppen nach der Wertung, die beste zuerst @sortierte_projektnummern = sort ( {$projekt{$a} <=> $projekt{$b} } keys (%projekt) ); # wir erstellen die eigentliche Tabelle my $tabelle = ''; foreach my $projektnummer ( @sortierte_projektnummern ) { # jede Zeile mit Nr, Thema, Anzahl B., schlechteste B., beste B., durchschn. B. $zeile = '<tr>'; $temp = $projektnummer + 1; $zeile .= "<td>&nbsp;$temp</td>"; $zeile .= "<td>$themen[$projektnummer]</td>"; $zeile .= "<td>$anz_bewertungen_fuer_projekt[$projektnummer]</td>"; $zeile .= "<td>$schlechteste_bewertung_fuer_projekt[$projektnummer]</td>"; $zeile .= "<td>$beste_bewertung_fuer_projekt[$projektnummer]</td>"; $zeile .= "<td><font color=\"#0000A0\"><b>$durchschnittliche_bewertung_fuer_projekt[$projektnummer]</b></font></td>"; $zeile .= '</tr>'; $tabelle .= $zeile; } # wir lesen die Vorlage (Template) ein open DATEI, $template_bewertung or die "konnte Datei $template_bewertung nicht öffnen! $!\n"; @text = <DATEI>; close DATEI; # wir geben die HTML-Seite aus: print "Content-type: text/html\n\n"; foreach my $zeile (@text) { $zeile =~ s/%%%tab%%%/$tabelle/; print $zeile; } ##################### Ende des Hauptprogramms ################## # Aufruf: $gesamtpunkte = &bilde_gesamtpunkte_bei_dieser_bewertung( @punkte_des_projekts ) sub bilde_gesamtpunkte_bei_dieser_bewertung { my @punkte_des_projekts = @_; my $gesamtpunkte = 0; # wir addieren alle Punkte auf foreach my $element ( @punkte_des_projekts ) { $gesamtpunkte += $element; } # gleich nochmal, weil alle Punkte doppelt zählen foreach my $element ( @punkte_des_projekts ) { $gesamtpunkte += $element; } # außer das Impressum (soll nur einfach zählen, also einmal abziehen) my $punkte_fuer_impressum = pop @punkte_des_projekts; $gesamtpunkte = $gesamtpunkte - $punkte_fuer_impressum; return $gesamtpunkte; } # Aufruf: @punkte_des_projekts = &transformiere_zensuren_in_punkte( @temp ); sub transformiere_zensuren_in_punkte { my @zensuren = @_; my @punkte = (); my $punkte; foreach my $zensur (@zensuren) { $punkte = 6 - $zensur; push @punkte, $punkte; } return @punkte; } # Aufruf: @zeilen = &lies_datei( 'wertung', $datei ); sub lies_datei { my $verzeichnis = shift; my $datei = shift; open DATEI, '<', $verzeichnis . '/' . $datei or die $! ; my @zeilen = <DATEI>; close DATEI; return @zeilen; } # Aufruf: ($themen_lref, $urls_lref) = &read_projektdata( $file ); sub read_projektdata { my $file = shift; my (@daten, $key, $value); my @themen = (); my @urls = (); open DATEI, "<", $file or die "konnte Datei $file nicht einlesen! $!\n"; @daten = <DATEI>; close DATEI; foreach my $zeile (@daten) { unless ($zeile =~ /^\s*$/ or $zeile =~ /^#/) { # Leerzeile + Kommentarzeile ignoriert chomp $zeile; # Zeilenumbruch entfernt ($key, $value) = split /\s*=>\s*/, $zeile; # wir trennen Key und Value # wir entfernen Leerzeichen am Anfang und Ende vom Key und vom Value if ($key =~ /^\s*(.*)\s*$/) { $key = $1 } if ($value =~ /^\s*(.*)\s*$/) { $value = $1 } # wir entfernen einfache Anführungszeichen vom Key und vom Value if ($key =~ /^'(.*)'$/) { $key = $1 } if ($value =~ /^'(.*)'$/) { $value = $1 } # wir entfernen doppelte Anführungszeichen vom Key und vom Value if ($key =~ /^"(.*)"$/) { $key = $1 } if ($value =~ /^"(.*)"$/) { $value = $1 } # wir stecken den Key in die Liste @themen und den Value in die Liste @urls push @themen, $key; push @urls, $value; } } return \@themen, \@urls; } # wir erstellen die Liste der Dateinamen (also von jedem User) sub hole_liste_der_bewertungen { my $verzeichnis = shift; # wir gehen ins Unterverzeichnis 'wertung' opendir (VERZ, $verzeichnis); # wir lesen das Verzeichnis ein my @files = readdir(VERZ); closedir VERZ; my @liste = (); # die einträge '.' und '..' entfernen, dazu umkopieren foreach my $element (@files) { if ($element ne '.' and $element ne '..') { push @liste, $element; } } return @liste; } __END__