Pro jednoduchost uvažujme, ze se jména studentů jsou různá - opakovaný výskyt jména Novák znamená další položku pro studenta Nováka a ne jiného studenta se stejným jménem. (Převzato z knihy Programování v jazyce Perl od Larryho Walla.) Vstupní data (zkopírujte do souboru, z něho potom budete data číst):
Novak 8 Polak 16 Vesely 7 Bednar 14 Novak 9 Bednar 6 Rychly 10 Dostal 12 Novak 10 Rychly 5 Novak 8Mělo by se vypsat:
Novak: 8, 9, 10, 8 Prumer: 8.75 Polak: 16 Prumer: 16 Vesely: 7 Prumer: 7 Bednar: 14, 6 Prumer: 10 Rychly: 10, 5 Prumer: 7.5 Dostal: 12 Prumer: 12Možné řešení:
open F, "hodnoceni" or die "Neni soubor s hodnocenim\n"; # cteme radky ze souboru while (<F>) { # radek rozdelime podle mezery ($jmeno, $hodnoceni) = split ' '; # do hashe %hodnoceni ke klci JMENO pridame dalsi hodnoceni a carku $hodnoceni{$jmeno} .= $hodnoceni.', '; } # vypocitame si maximalni delku retezce se jmenem a hodnocenimi, # neni nutne, je zde pouze pro formatovani (zatim neumime # pouzivat formaty :-) $max_delka = 0; for (keys %hodnoceni) { $delka = length($_.': '.$hodnoceni{$_}); $max_delka = $delka if $delka > $max_delka; } # v promenne $max_delka mame delku nejdelsiho radku # projdeme vsechna jmena, seradime podle abecedy for (sort keys %hodnoceni) { # orizneme posledni dva znaky (retezec ", ") chop $hodnoceni{$_}; chop $hodnoceni{$_}; # nebo $hodnoceni{$_} =~ s/..$//; # ale nezname regularni vyrazy :-( # vypiseme jmeno, hodnoceni a mezery do maximalni delky radku print "$_: $hodnoceni{$_}", ' 'x ($max_delka - length("$_:$hodnoceni{$_}")); # vypocitame prumer $pocet = 0; $soucet = 0; for (split ', ', $hodnoceni{$_}) { $pocet++; $soucet += $_; } # vypiseme prumer a odradkujeme print "Prumer: ", $soucet/$pocet, "\n"; }
print "Zadejte vyraz: "; while (my $vyraz = <>) { $vysledek = eval $vyraz; unless ($@) { print "Vysledek je: $vysledek\n"; } else { print "Chyba: $@\n"; } print "Zadejte vyraz: "; }
sub nasobky ($) { my $hodnota = shift; # najdeme prvni cislo, ktere je mensi nebo rovno a delitelne 5 $hodnota-- while $hodnota % 5; return sub { $hodnota += 5; return $hodnota; } } $gen = nasobky 5; $gen1 = nasobky 3; print &$gen, "\n" for 1..10; # vytiskne 10..55 print &$gen1, "\n" for 1..10; # vytiskne 5..50