#!/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> $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__