Procesare de date PERL



Procesare de date.


Exemplu: Tabel cu rezultatele studentilor.



Programul produce un raport cu rezultatele studentilor la examene, combinand date din doua fisiere ce contin informatii despre studenti respectiv notele obtinute de fiecare la examene.

Fisierul de intrare studenti are campurile delimitate prin : si contine pe fiecare linie numarul matricol, numele si anul in care este studentul.

28602:Muresan Robert:2

38601:Pop Ioan:3

48000:Pop Vasile:1

Fisierul de intrare note are campurile delimitate prin spatii si contine pe fiecare linie numarul matricol, examenul, si numarul de credite obtinute.

28602 1 4

38601 1 2

48000 1 1

28602 2 5

38601 2 3

Se observa ca Pop Vasile a lipsit la al 3-lea examen.


Raportul afisat de program arata in felul urmator:


Nr. Mat Nume 1 2 Total

28602 Muresan Robert 4 5 9

38601 Pop Ioan 2 3 5

48000 Pop Vasile 1 1

Total: 7 8

Programul care a generat acest raport este urmatorul:


#! usr/bin/perl

# Catalog de Note - pentru demonstrarea lucrului cu sistemul I/O, liste asociative # sortare si formatarea unui raport

# Programul accepta orice numar de studenti si examene, respectiv trateaza si # cazurile cand anumite informatii lipsesc.

$studfile = 'studenti';

$notfile = 'note';


# Daca fisierele se pot deschide, atunci perl nu mai evalueaza si restul expresiei ce # urmeaza dupa ||


open (NUME,'<studfile') || die 'Nu pot deschide fisierul $studfile! n';

open(NOTE,'<notfile') || die 'Nu pot deschide fisierul $notfile! n';


# Construieste o lista asociativa cu informatiile despre studenti folosind ca si # cheie, numarul matricol


while(<NUME>) = $nume;

if (length($nume) > $maxlengthnume)

}

close NUME;


# Construieste un tabel cu notele de la exemene


while(<NOTE>) = split;

$nota = $nota;

if ($nrexam > $maxnrexam)

}

close NOTE;


# Tipareste raportul cu datele citite


printf '%6s %-$s ','Nr. Mat','Nume';

foreach $nrexam(1..$maxnrexam)

printf '%10snn','Total:';


# Subrutina dupanume este folosita pentru sortarea sirului %nume

# Functia 'sort' transmite variabilele $a si $b subrutinelor pe care le apeleaza

# Functia ' x cmp y ' returneaza -1 daca x < y , 0 daca x=y si 1 daca x > y.


sub dupanume cmp $nume}


# Ordoneaza numerele matricole astfel incat numele studentilor sa apara in # ordine alfabetica

foreach $nrmat(sort dupanume keys(%nume)){

# Tipareste creditele obtinute si totalul pentru fiecare student

printf '%6d %-$s ', $nrmat,$nume;

$total = 0;

foreach $nrexam(1..$maxnrexam){

printf '%4s',$nota;

$total += $nota($nrmat,$nrexam);

$examtot($nrexam) += $nota($nrmat,$nrexam);

}

printf '%10dn',$total;

}


printf 'n%6s %$s ',' ','Total: ';

foreach $nrexam(1..$maxnrexam);

}

printf 'n';

exit(0).